home *** CD-ROM | disk | FTP | other *** search
/ BBS Toolkit / BBS Toolkit.iso / rbbs_pc / mpl172b.zip / RBBS-PC.BAS < prev    next >
BASIC Source File  |  1989-09-12  |  176KB  |  4,952 lines

  1. 3 ' $linesize: 132
  2. 4 ' $title: 'RBBS CPC17.2B, Copyright 1989 by D. Thomas Mack'
  3. 5 ' WARNING !!! DO NOT CHANGE, BYPASS OR REMOVE LINES 3-29
  4. 9 'by D. Thomas Mack, 39 Cranbury Drive, Trumbull, CT 06611
  5. 11 '  Ken Goosens, 5020 Portsmouth Road, Fairfax, VA 22032
  6. 13 '
  7. 14 ' *******************************NOTICE*************************************
  8. 15 ' *  A limited license is granted to all users of this program and it's    *
  9. 16 ' *  companion program, CONFIG (version 17.2B), to make copies of this     *
  10. 17 ' *  program and distribute the copies to other users, on the following    *
  11. 18 ' *  conditions:                                                           *
  12. 19 ' *    1.   The notices contained in lines 3 through 29 of the program     *
  13. 20 ' *         are not altered, bypassed, or removed.                         *
  14. 21 ' *    2.   The program is not to be distributed to others in modified     *
  15. 22 ' *         form (i.e. the line numbers must remain the same).             *
  16. 23 ' *    3.   No fee is to be charged (or any other consideration received)  *
  17. 24 ' *         for copying or distributing these programs without an express  *
  18. 25 ' *         written agreement with D. Thomas Mack, The Second Ring, 39     *
  19. 26 ' *         Cranbury Drive, Trumbull, Conneticut 06611                     *
  20. 27 ' *                                                                        *
  21. 28 ' *       Copyright (c) 1983-1989 D. Thomas Mack, The Second Ring          *
  22. 29 ' **************************************************************************
  23.    '
  24.    ' $INCLUDE: 'RBBS-VAR.BAS'
  25.    '
  26.    ' $SUBTITLE: 'Main-line RBBS-PC Program'
  27.     CRLF$ = CHR$(13) + CHR$(10)
  28.     J = 60
  29.     REDIM OPT.SEC(J)
  30.     CONFIG.FILENAME$ = "RBBS-PC.DEF"
  31.     CALL GETCOMND (DEBUG,NETIME$,NETBAUD$,NETRELIABLE$)
  32.     SUBROUTINE.PARAMETER = -62
  33.     BULLETIN.MENU$ = ""
  34.     CALL READDEF (CONFIG.FILENAME$)
  35.     IF EC > 0 THEN _
  36.        GOTO 31
  37.     CALL MLINIT (1)
  38.     SUBROUTINE.PARAMETER = -9
  39.     CALL CARRIER
  40.     IF SUBROUTINE.PARAMETER THEN _
  41.        CALL COPYWRIT
  42.     GOTO 100
  43. 31  SNOOP = -1
  44.     CALL PSCRN ("Configuration "+CONFIG.FILENAME$+" missing or improper format.") : _
  45.     GOTO 204
  46. 100 CLEAR,,SIZE.OF.STACK
  47.     DEF SEG                            ' Point to BASIC
  48.     WIDTH 80                           ' Set Screen Width
  49.     SCREEN 0,0,0                       ' Text, No color, Pg 0
  50.     KEY OFF                            ' Line 25 turned off
  51.     DEFINT A-Z                         ' All var. integer
  52. ' ********************* Variable Definitions *******************************
  53. 102 ADIM = 99
  54.     MM = 999
  55.     BX = 75
  56.     J = 60
  57.     REDIM OPT.SEC(J)
  58.     REDIM CATEGORY.NAME$(BX),CATEGORY.CODE$(BX),CATEGORY.DESC$(BX)  ' KG052401
  59.     REDIM A$(ADIM)                      ' Message line table
  60.     REDIM B$(ADIM)                      ' Message line table
  61.     REDIM M(MM,2)                       ' Message pointers           ' KG081005
  62.     CALL VARINIT
  63. 105 VERSION.ID$ = "Maple 17-2b beta 09/10/89"
  64. 106 CALL GETCOMND (DEBUG,NETIME$,NETBAUD$,NETRELIABLE$)
  65.     SUBROUTINE.PARAMETER = 1
  66.     CALL READDEF (CONFIG.FILENAME$)
  67.     IF EC > 0 THEN _
  68.        GOTO 31
  69.     REDIM WORK.ARA$(MAX.WORK.VAR)                                    ' KG081005
  70.     REDIM GSR.ARA$(MAX.WORK.VAR)                                     ' KG081005
  71.     USE.TPUT = (UPPER.CASE OR XON.XOFF)
  72.     ORIG.UPGRADE.SEC = AUTO.UPGRADE.SEC
  73.     ORIG.CALLERS$ = CALLERS.FILE$
  74.     ORIG.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$
  75.     ORIG.USER.FILE$ = MAIN.USER.FILE$
  76.     ORIG.MIN.SEC = MINIMUM.LOGON.SECURITY
  77.     ORIG.SYSOP.FN$ = SYSOP.FIRST.NAME$
  78.     ORIG.SYSOP.LN$ = SYSOP.LAST.NAME$
  79.     EXPERT.USER = EXPERT.USER.DEF
  80.     PROMPT.BELL = PROMPT.BELL.DEF
  81.     CALL BRKFNAME (ORIG.MESSAGE.FILE$,DRV$,ORIG.MSG.NAME$,Y$,FALSE)
  82.     IF ORIG.MSG.NAME$ = "MESSAGES" THEN _
  83.        ORIG.MSG.NAME$ = "MAIN" _
  84.     ELSE IF RIGHT$(ORIG.MSG.NAME$,1) = "M" THEN _
  85.             ORIG.MSG.NAME$ = LEFT$(ORIG.MSG.NAME$,LEN(ORIG.MSG.NAME$)-1)
  86.     GRN.NAME$ = ORIG.MSG.NAME$
  87.     IF NET.MAIL$ <> "NONE" AND VAL(NETIME$) > 0 THEN _
  88.        LIMIT.MINUTES.PER.SESSION! = VAL(NETIME$)
  89.     IF NET.MAIL$ <> "NONE" AND VAL(NETBAUD$) > 0 THEN _
  90.        EXPECT.ACTIVE.MODEM = TRUE : _
  91.        IF KEEP.INIT.BAUD > -1 THEN _                                 ' WM042201
  92.           IF KEEP.INIT.BAUD = 0 OR VAL (NETBAUD$) > 2400 THEN _      ' WM042201
  93.           MODEM.INIT.BAUD$ = NETBAUD$
  94.     IF FOSSIL THEN _
  95.        COMPORT% = VAL(RIGHT$(COM.PORT$,1)) - 1 : _
  96.        IF COMPORT% < 0 THEN _
  97.           GOTO 108 _
  98.        ELSE CALL FOSINIT(COMPORT%,RESULT%) : _
  99.             IF RESULT% = -1 THEN _
  100.                SNOOP = TRUE : _
  101.                CALL PSCRN("ERROR INITIALIZING FOSSIL") : _
  102.                GOTO 204
  103. 108 CALL BRKFNAME (CALLERS.FILE$,DRV$,X$,Y$,TRUE)
  104.     CALLERS.FILE.PREFIX$ = X$
  105.     ARC.WORK$ = DRV$ + _
  106.                 "ARCWORK" + _
  107.                 NODE.FILE.ID$ + _
  108.                 ".DEF"
  109.     IF USE.BASIC.WRITES THEN _
  110.        LOCAL.BACKSPACE$ = BACK.ARROW$ _
  111.     ELSE LOCAL.BACKSPACE$ = BACKSPACE$
  112.     SYSOP.FULL.NAME$ = LEFT$(SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$,22)
  113. '
  114. ' *****  INITIALIZE NETBIOS INTERFACE   ****
  115. '
  116.    IF NETWORK.TYPE = 6 AND NOT SUB.BOARD THEN _
  117.       CALL INITIBM
  118. '
  119. ' *****  ESTABLISH NEXT CALLERS FILE RECORD AVAILABLE   ***
  120. '
  121.     CALL SETCALL
  122. 112 IF NOT SUB.BOARD THEN _
  123.        LOCAL.USER = TRUE : _
  124.        A$ = COLOR.RESET$ : _
  125.        SUBROUTINE.PARAMETER = 1 : _
  126.        CALL TPUT : _
  127.        LOCAL.USER = FALSE
  128.     UPLOAD.DRIVE.FILE$ = RIGHT$(DOWNLOAD.DRIVES$,1)+":FREESPAC.UPL"
  129.     MINUTES.PER.SESSION.DEF! = MINUTES.PER.SESSION!                  ' KG072604
  130.     MAX.PER.DAY.DEF = MAX.PER.DAY                                    ' KG072604
  131. '
  132. ' *****  TEST FOR MESSAGE FILE PRESENT (ABORT IF NOT PRESENT)  ****
  133. '
  134. 135 IF CURRENT.DEF$ = ORIG.CONFIG$ THEN _
  135.        ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$ : _
  136.        ACTIVE.USER.FILE$ = MAIN.USER.FILE$
  137.     GOSUB 4910
  138.     IF CONFERENCE.MODE THEN _
  139.        GOTO 150
  140.     LOCAL.USER.MODE = (RIGHT$(COM.PORT$,1) < "1")
  141.     GET 1,NODE.RECORD.INDEX
  142.     Y$ = MID$(MESSAGE.RECORD$,77,2)
  143.     CALL UNCDATE (Y$,X,L,I,OLD.DAT$)
  144.     OLD.DAT$ = LEFT$(OLD.DAT$,6) + MID$(STR$(X),2)
  145.     TIME.TO.DROP.TO.DOS = - (TIME.TO.DROP.TO.DOS > 0) * TIME.TO.DROP.TO.DOS
  146.     HR! = INT(TIME.TO.DROP.TO.DOS / 100)
  147.     MN! = TIME.TO.DROP.TO.DOS - HR! * 100
  148.     TIME.TO.DROP.TO.DOS! = HR! * 3600 + MN! * 60
  149. '
  150. ' ******  TEST FOR TIMED EXIT ACTIVE   *****
  151. '
  152. 140 CALL FINDTIME (TI!)
  153.     IF TIME.TO.DROP.TO.DOS > 0 AND _
  154.        OLD.DAT$ <> DATE$ AND _
  155.        TI! >= TIME.TO.DROP.TO.DOS! THEN _
  156.        GOTO 206
  157. '
  158. ' **** GET CURRENT STATUS OF SYSOP AVAIL, SYSOP ANNOY, SYSOP NEXT, & PRINTER
  159. '
  160. 150 IF SUB.BOARD THEN _
  161.        GOSUB 12987 : _
  162.        GOSUB 5135 : _
  163.        GOTO 170
  164.     SYSOP.AVAILABLE = VAL(MID$(MESSAGE.RECORD$,32,2))
  165.     SYSOP.ANNOY = VAL(MID$(MESSAGE.RECORD$,34,2))
  166.     SYSOP.NEXT = VAL(MID$(MESSAGE.RECORD$,36,2))
  167.     MID$(MESSAGE.RECORD$,36,2) = STR$(FALSE)
  168.     PRINTER = VAL(MID$(MESSAGE.RECORD$,38,2))
  169.     IF TURN.PRINTER.OFF THEN _
  170.        PRINTER = FALSE
  171.     EXIT.TO.DOORS = (MID$(MESSAGE.RECORD$,40,2) = "-1" AND NETBAUD$ = "")
  172.     EIGHT.BIT = VAL(MID$(MESSAGE.RECORD$,42,2))
  173.     BPS = VAL(MID$(MESSAGE.RECORD$,44,2))
  174.     SNOOP = VAL(MID$(MESSAGE.RECORD$,58,2))
  175.     MID$(MESSAGE.RECORD$,57,1) = "I"
  176.     PRIVATE.DOOR = (MID$(MESSAGE.RECORD$,72,2) = "-1")               ' KG061601
  177.     IF PRIVATE.DOOR THEN _                                           ' KG052501
  178.        HAS.PRIVDOOR = TRUE                                           ' KG052501
  179.     MID$(MESSAGE.RECORD$,72,2) = STR$(FALSE)
  180.     LOCAL.USER = (MID$(MESSAGE.RECORD$,101,2) = "-1")                ' KG061601
  181.     IF EXIT.TO.DOORS OR PRIVATE.DOOR THEN _
  182.        HAS.DOORED = TRUE : _
  183.        TURBO.LOGON = TRUE
  184.     PUT 1,NODE.RECORD.INDEX
  185.     GOSUB 12985
  186. '
  187. ' *****  INITIALIZE VOICE SYNTHESIZER   ****
  188. '
  189.     CALL TALK (INIT,A$)
  190. '
  191. ' *****  TEST FOR MULTI LINK PRESENT IF NOT COMPAQ COMPUTER   ****
  192. '
  193. 160 CALL MLINIT (4)
  194. 170 FOR FUNCTION.KEY.INDEX = 1 TO 10
  195.        KEY FUNCTION.KEY.INDEX,""
  196.     NEXT
  197.     CALL LOADNEW (M())
  198. '
  199. ' ******  INITIALIZE FILE MANAGEMENT SYSTEM, CHECK FOR LOCAL BBS MODE
  200. '
  201. 175 GOSUB 5344
  202.     CALL CTLINES (MAX.ENTRIES)
  203.     REDIM CATEGORY.NAME$(MAX.ENTRIES),CATEGORY.CODE$(MAX.ENTRIES),_
  204.           CATEGORY.DESC$(MAX.ENTRIES) : _
  205.     CALL INITFMS (CATEGORY.NAME$(),CATEGORY.CODE$(), _
  206.                   CATEGORY.DESC$(),NUM.CATEGORIES)
  207.     MAX.MESSAGE.LINES = MAX.MESSAGE.LINES.DEF
  208.     LOCAL.USER = (LOCAL.USER OR LOCAL.USER.MODE)
  209.     IF (NOT LOCAL.USER) AND (NOT SUB.BOARD) THEN _
  210.        CALL OPENCOM (MODEM.INIT.BAUD$,",N,8,1")
  211.     IF NOT SUB.BOARD THEN _
  212.        CALL SETECHO (DEFAULT.ECHOER$)
  213.     CALL BRKFNAME (CALLERS.FILE$,DRV$,X$,Y$,TRUE)
  214.     NODE.WORK.FILE$ = DRV$ + _
  215.                       "NODE" + _
  216.                       NODE.FILE.ID$ + _
  217.                       "WRK"
  218.     SECONDS.PER.SESSION! = MINUTES.PER.SESSION! * 60
  219.     IF NOT LOCAL.USER.MODE THEN _
  220.        IF NOT EXIT.TO.DOORS THEN _
  221.           GOTO 180 _
  222.        ELSE IF NOT LOCAL.USER THEN _
  223.                GOTO 180
  224.     LOCAL.USER = TRUE
  225.     BPS = -6
  226.     BAUD.TEST! = 9600                                                ' KG090102
  227.     EIGHT.BIT = TRUE
  228.     SNOOP = TRUE
  229.     IF EXIT.TO.DOORS THEN _
  230.        CALL AMORPMTD : _                                             ' KG061203
  231.        CALL READPROF : _
  232.        GOTO 410
  233.     GOSUB 178
  234.     GOTO 345
  235. 178 IF SUB.BOARD THEN _
  236.        IF FIRST.NAME$ = SYSOP.FIRST.NAME$ AND _
  237.           LAST.NAME$ = SYSOP.LAST.NAME$ THEN _
  238.              RETURN 832 _
  239.        ELSE RETURN 800
  240.     RETURN
  241. 180 SUBROUTINE.PARAMETER = 2
  242.     CALL LINE25
  243.     GOSUB 178
  244. '
  245. ' ******  WAIT FOR THE PHONE TO RING AND ANSWER IT   ****
  246. '
  247.     SUBROUTINE.PARAMETER = 1
  248. 200 TOGGLE.ONLY = TRUE
  249.     CALL ANSWERIT
  250.     GET 1,NODE.RECORD.INDEX
  251.     SNOOP = VAL(MID$(MESSAGE.RECORD$,58,2))
  252.     TOGGLE.ONLY = FALSE
  253.     IF EC > 1 THEN _
  254.        GOTO 13000
  255.     IF SUBROUTINE.PARAMETER < 0 THEN _
  256.        GOTO 202
  257.     ON SUBROUTINE.PARAMETER GOTO 410, _   '  1 = ANSWERED PHONE & CARRIER FOUND
  258.                                  330, _   '  2 = CARRIER FOUND BEFORE ANSWERING
  259.                                  822, _   '  3 = SYSOP GETS SYSTEM NEXT
  260.                                10595, _   '  4 = ANSWERED PHONE BUT NO CARRIER
  261.                                13540, _   '  5 = NOT USED
  262.                                  202, _   '  6 = LOCAL SYSOP KEY PRESSED
  263.                                  206, _   '  7 = TIME TO DROP TO DOS
  264.                                13538      '  8 = NO CALLS! TIME TO RECYCLE
  265. 202 FF = -SUBROUTINE.PARAMETER
  266.     ON FF GOTO 10595, _   '  -1 = CARRIER DROPPED
  267.                 4770, _   '  -2 = SYSOP INITIATED CHAT
  268.                  205, _   '  -3 = FORCE SYSTEM TO ANSWER THE PHONE
  269.                  204, _   '  -4 = EXIT TO DOS IMMEDEATELY
  270.                  203, _   '  -5 = EXIT TO DOS AFTER CLEAN-UP
  271.                10698, _   '  -6 = INDICATE ACCESS IS DENIED AND LOGOFF USER
  272.                10620      '  -7 = UPDATE CALLERS FILE AND LOGOFF USER
  273. 203 CALL MLINIT(3)
  274. 204 IF FOSSIL THEN _
  275.        CALL FOSEXIT(COMPORT%)
  276.     SYSTEM
  277. 205 SUBROUTINE.PARAMETER = 4
  278.     GOTO 200
  279. 206 CALL TIMEDOUT
  280.     GOTO 203
  281. 330 CALL CARRIER
  282.     IF SUBROUTINE.PARAMETER = -1 THEN _
  283.        GOTO 10595
  284.     CALL EOFCOMM (CHAR%)
  285.     IF CHAR% = -1 THEN _
  286.        GOTO 335
  287.     CALL FLUSHCOM (DF$)
  288.     IF SUBROUTINE.PARAMETER = -1 THEN _
  289.         GOTO 10595
  290.     GOTO 330
  291. 335 EXIT.TO.DOORS = FALSE
  292.     PRIVATE.DOOR = FALSE
  293.     IF C.L <> 1 THEN _
  294.        LOCATE 22,34
  295.     D$ ="CONNECT" + _
  296.         STR$(BAUD.TEST!) + _                                         ' KG090102
  297.         "     "
  298.     GOSUB 1315
  299. '
  300. ' *****  DISPLAY WELCOME LINE  ****
  301. '
  302. 345 LOCATE 24,1
  303.     CALL AMORPMTD                                                    ' KG061203
  304.     CALL FINDTIME (USER.LOGON.TIME!)
  305.     TIME.LOGGED.ON$ = TIME$
  306.     LINES.PRINTED = 0
  307.     EXPERT.USER.DEF = EXPERT.USER
  308.     EXPERT.USER = FALSE
  309.     CALL SETEXPERT
  310.     IF NODES.IN.SYSTEM > 1 THEN _
  311.        A$ = " - NODE " + NODE.ID$ _
  312.     ELSE A$ = ""
  313.     CALL QTPUT1 ("WELCOME TO " + RBBS.NAME$ + A$)
  314.     TEST.PARITY = TRUE
  315.     STOP.INTERRUPTS = TRUE
  316.     FILE.NAME$ = PRELOG$
  317.     CALL FLUSHCOM (X$)
  318.     COMMPORT.STACK$ = ""
  319. 346 GOSUB 466
  320.     IF SUBROUTINE.PARAMETER = -1 THEN _
  321.        GOTO 13540
  322.     FF = FALSE
  323. '********** Delete all the files in ARKVIEW.PATH$ **********
  324. '***********************************************************
  325. 'First create a Dummy file so the directory is not empty. It
  326. 'avoids having to use an ON ERROR routine if the directory
  327. 'is empty. Then just kill everything in the ARKVIEW.PATH$
  328. '***********************************************************
  329. CALL OPENOUTW(ARKVIEW.PATH$ + "\DANDAN.DAN")
  330.     CLOSE 2
  331.   CALL KILLWORK(ARKVIEW.PATH$ + "\*.*")
  332. '
  333. '
  334. '
  335. '
  336. ' *****  GET USER NAME
  337. ' *****  C - COMMAND FROM NEWUSER REGISTER OPTIONS (CHANGE NAME OR ADDRESS)
  338. '
  339. 400 CALL SKIPLINE(1)
  340.     ESCAPE.INSECURE = FALSE
  341.     UPPER.CASE = FALSE
  342.     EXPERT.USER = EXPERT.USER.DEF
  343.     CALL SETEXPERT
  344.     A1$ = "What is your "
  345.     GOSUB 12500
  346.     CALL COMMINFO
  347.     IF FF THEN _
  348.        LOGON.ERROR.INDEX = 1 : _
  349.        GOTO 10620
  350.     IF MIN.OLDCALLER.BAUD > BAUD.TEST! THEN _                        ' KG090102
  351.        CALL QTPUT (MID$(STR$(BAUD.TEST!),2) + " BAUD ACCESS NOT ALLOWED!",2) : _ ' KG090102
  352.        LG$(7) = "OLD CALLER BAUD RESTRICTION" : _
  353.        LOGON.ERROR.INDEX = 7 : _
  354.        GOTO 10620
  355.     TURBO.LOGON = (LEFT$(B$(4),1) = "!")
  356.     HOME.CONFERENCE$ = RIGHT$(B$(4),LEN(B$(4)) + TURBO.LOGON)
  357. '
  358. ' *****  CHECK IF SAME USER ON ANOTHER NODE   ***
  359. '
  360. 410 IF EXIT.TO.DOORS THEN _
  361.        CURRENT.DATE$ = MID$(MESSAGE.RECORD$,119,2) + _
  362.                        "-" + _
  363.                        MID$(MESSAGE.RECORD$,121,2) + _
  364.                        "-" + _
  365.                        MID$(MESSAGE.RECORD$,123,2) : _
  366.        TIM$ = MID$(MESSAGE.RECORD$,125,2) + _
  367.               ":" + _
  368.               RIGHT$(MESSAGE.RECORD$,2) : _
  369.        IF LEFT$(TIM$,2) < "12" THEN _
  370.           TIM$ = TIM$ + _
  371.                  " AM" _
  372.        ELSE TIM$ = TIM$ + _
  373.                    " PM"
  374.     NODE.INDEX = 2
  375.     XX = NODES.IN.SYSTEM + 1
  376. 412 IF NODE.INDEX > XX THEN _
  377.        GOTO 430
  378.     GET 1,NODE.INDEX
  379.     IF INSTR(MESSAGE.RECORD$,ACTIVE.USER.NAME$) THEN _
  380.        GOTO 420
  381.     NODE.INDEX = NODE.INDEX + 1
  382.     GOTO 412
  383. 420 IF MID$(MESSAGE.RECORD$,57,1) = "A" THEN _
  384.        LOGON.ERROR.INDEX = 6 : _
  385.        LG$(6) = LG$(6) + _
  386.                 LEFT$(MESSAGE.RECORD$,25) : _
  387.        A$ = "Name <" + ACTIVE.USER.NAME$ + "> in use on another node" : _
  388.        CALL RINGCALLER : _
  389.        GOTO 10620
  390.     FIRST.NAME$ = LEFT$(MESSAGE.RECORD$,INSTR(MESSAGE.RECORD$, " ") - 1)
  391.     IF NOT PRIVATE.DOOR THEN _
  392.        CALL SKIPLINE (1) : _
  393.        CALL QTPUT1 (FIRST.NAME$ + ", welcome back!") : _
  394.        CALL TALK (11,A$)
  395.     IF EXIT.TO.DOORS THEN _
  396.        GOTO 457
  397. '
  398. ' *****  TEST FOR REMOTE SYSOP LOGGING ON   ***
  399. '
  400. 430 GET 1,NODE.RECORD.INDEX
  401.     SAME.USER = (ACTIVE.USER.NAME$ = LEFT$(MESSAGE.RECORD$,LEN(ACTIVE.USER.NAME$)))
  402.     DEL.SPACE = INSTR(MID$(MESSAGE.RECORD$,1,31),"  ")               'JAB110286
  403.     PREV.USER.NAME$ = MID$(MESSAGE.RECORD$,1,DEL.SPACE+1) +_         'JAB110286
  404.     MID$(MESSAGE.RECORD$,93,24)                      'JAB110286
  405. '
  406. ' *****  TEST FOR SYSOP NAME ATTEMPT  ***
  407. '
  408. 445 IF INSTR(ACTIVE.USER.NAME$,"SYSOP") OR _
  409.        INSTR(ACTIVE.USER.NAME$,SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$) THEN _
  410.        LOGON.ERROR.INDEX = 2 : _
  411.        GOTO 10620
  412. '
  413. ' *****  REMOVE INVALID CHARACTERS FROM USER NAME  ***
  414. '
  415. 455 CALL BADCHAR (ACTIVE.USER.NAME$)
  416.     IF ACTIVE.USER.NAME$ = "" THEN _
  417.        GOTO 400
  418. '
  419. ' ****  CHECK FOR ACTIVE USER   ***
  420. '
  421. 457 CALL SKIPLINE (1)
  422.     GOSUB 12840
  423.     GOSUB 12850
  424.     GOSUB 12598
  425.     GOSUB 11482
  426.     CALL COMPDATE (TODAY.REG.YY,TODAY.REG.MM,TODAY.REG.DD,TODAY.COMPUTE.DATE!)
  427.     IF NOT FOUND THEN _
  428.        GOTO 700
  429.     GOSUB 12984
  430. '
  431. ' *****  ACTIVE USER FOUND  ****
  432. '
  433. 459 GOSUB 9500
  434.     LAST.DATE.TIME.ON.SAVE$ = LAST.DATE.TIME.ON$
  435.     IF EXIT.TO.DOORS THEN _
  436.        TEMP.HOLD.TIME! = VAL(LEFT$(TIM$,2))*3600 + _
  437.                          VAL(MID$(TIM$,4,2))*60 : _
  438.        CALL FINDTIME (TEMP.LOGON.TIME!) : _                          ' KP061804
  439.        MINUTES.IN.DOORS = INT((TEMP.LOGON.TIME! - _                  ' KP061804
  440.                               (TEMP.LOGON.TIME! <= TEMP.HOLD.TIME!) * 86400 - _ ' KP061804
  441.                               TEMP.HOLD.TIME!) / 60) : _
  442.        CALL TIMEREMAIN (TIME.REMAINING!)
  443.     USER.FILE.INDEX = LOC(5)
  444.     GOSUB 5135
  445. '
  446. ' ***  COMPUTE THE NUMBER OF DAYS REMAINING UNTIL REGISTRATION EXPIRES **
  447. '
  448.     IF RESTRICT.BY.DATE THEN _
  449.        CALL COMPDATE (USER.REG.YY,USER.REG.MM,USER.REG.DD,USER.COMPUTE.DATE!) : _
  450.        REG.DAYS.REMAINING = USER.COMPUTE.DATE! + _
  451.                             DAYS.IN.REGISTRATION.PERIOD - _
  452.                             TODAY.COMPUTE.DATE! : _
  453.        CALL EXPDATE (USER.COMPUTE.DATE!,DAYS.IN.REGISTRATION.PERIOD,EXPIRATION.DATE$) _
  454.     ELSE REG.DAYS.REMAINING = 365
  455.     IF NOT PRIVATE.DOOR THEN _
  456.        IF REG.DAYS.REMAINING < 0 THEN _
  457.        IF USER.SECURITY.LEVEL > EXPIRED.SECURITY THEN _
  458.           CALL QTPUT1 (LG$(9) + _
  459.                       " - security reset to " + _
  460.                       STR$(EXPIRED.SECURITY)) : _
  461.           LOGON.ERROR.INDEX = 9 : _
  462.           USER.SECURITY.LEVEL = EXPIRED.SECURITY : _
  463.           LSET SECURITY.LEVEL$ = MKI$(USER.SECURITY.LEVEL) : _
  464.           GOSUB 5135
  465. 460 USER.SECURITY.LEVEL$ = STR$(USER.SECURITY.LEVEL)
  466.     IF USER.SECURITY.LEVEL > -1 THEN _
  467.        USER.SECURITY.LEVEL$ = MID$(USER.SECURITY.LEVEL$,2)
  468.     IF USER.SECURITY.LEVEL >= MINIMUM.LOGON.SECURITY THEN _
  469.        GOTO 470
  470.     IF NOT PRIVATE.DOOR THEN _
  471.        GOSUB 465 : _
  472.        CALL DELAYIT (8 + BPS)
  473.     IF LOGON.ERROR.INDEX < 9 AND _
  474.        EC = 0 THEN _
  475.        LOGON.ERROR.INDEX = 8
  476.     GOTO 10620
  477. '
  478. ' ***  DISPLAY LOG-ON MESSAGE FOR SPECIFIC SECURITY LEVEL  **
  479. '
  480. 465 TURBO.LOGON = TURBO.LOGON AND (EXIT.TO.DOORS OR _
  481.                   (USER.SECURITY.LEVEL >= ALLOW.CALLER.TURBO))
  482.     IF TURBO.LOGON THEN _
  483.        RETURN
  484.     FILE.NAME$ = WELCOME.FILE.DRV.PATH$ + _
  485.                  "LG" + _
  486.                  USER.SECURITY.LEVEL$ + _
  487.                  ".DEF"
  488.     CALL GRAPHIC (USER.GRAPHIC.DEFAULT$,FILE.NAME$)
  489. 466 STOP.INTERRUPTS = TRUE
  490.     BYPASS.TIME.CHECK = TRUE
  491.     CALL BUFFILE (FILE.NAME$,X)
  492.     RETURN
  493. 470 GOSUB 12989
  494.     CI$ = CITY.STATE$
  495.     CALL TRIM (CI$)
  496.     ATTEMPTS.ALLOWED = 4
  497.     PASSWORD.SAVE$ = PASSWORD$
  498.     TEMP.SYSOP = (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL)
  499.     MESSAGE.PASSWORD = FALSE
  500.     IF NOT SUB.BOARD THEN _
  501.        ELAPSED.TIME = CVI(ELAPSED.TIME$)
  502.     IF EXIT.TO.DOORS THEN _                                          ' KP061804
  503.          DEDUCT.TIME = (TEMP.LOGON.TIME! - _                         ' KP061804
  504.            (MINUTES.IN.DOORS * 60) - USER.LOGON.TIME!) / 60 : _      ' KP061804
  505.          DEDUCT.TIME = DEDUCT.TIME - (1440 * (DEDUCT.TIME < 0)) : _  ' KP061804
  506.          ELAPSED.TIME = ELAPSED.TIME - DEDUCT.TIME _                 ' KP061804
  507.     ELSE IF CURRENT.DATE$ <> LEFT$(LAST.DATE.TIME.ON$,8) THEN _      ' KG061804
  508.             IF ELAPSED.TIME > 0 OR NOT KEEP.TIME.CREDITS THEN _
  509.                ELAPSED.TIME = 0
  510.     IF PRIVATE.DOOR AND _
  511.        TRANSFER.FUNCTION = 3 THEN _
  512.        GOSUB 755 : _
  513.        GOTO 800
  514.     IF PASSWORD.SAVE$ = SPACE$(LEN(PASSWORD.SAVE$)) THEN _
  515.        GOSUB 755 : _
  516.        GOTO 800
  517. 480 GOSUB 5370
  518.    ' IF PRIVATE.DOOR OR (A AND ESCAPE.INSECURE) OR DOOR.SKIPS.PASSWORD THEN OLD CODE
  519. IF PRIVATE.DOOR OR (A AND ESCAPE.INSECURE) OR EXIT.TO.DOORS THEN _ 'Pe 06/15/89
  520.        Z$ = PASSWORD.SAVE$ : _
  521.        PASSWORD.FAILED = 0 : _
  522.        GOTO 644
  523.     IF Q => 3 THEN _
  524.        Z$ = B$(3) : _
  525.        ATTEMPTS = 1 : _
  526.        SUBROUTINE.PARAMETER = 5 _
  527.     ELSE SUBROUTINE.PARAMETER = 4
  528.     CALL PASSWRD
  529. 630 IF PASSWORD.FAILED THEN _
  530.        GOSUB 825 : _
  531.        LOGON.ERROR.INDEX = 4 : _
  532.        GOTO 10620
  533. 643 GOSUB 41070
  534. 644 NEW.USER = FALSE
  535.     WK$ = RIGHT$(STR$(ASC(MID$(LIST.NEW.DATE$,2))),2) + _   ' MM
  536.            "/" + _
  537.            RIGHT$(STR$(ASC(MID$(LIST.NEW.DATE$,3))),2) + _  ' DD
  538.            "/" + _
  539.            RIGHT$(STR$(ASC(LIST.NEW.DATE$)),2)              ' YY
  540.     LM$ = RIGHT$(WK$,2) + _                                 ' YY
  541.           LEFT$(WK$,2) + _                                  ' MM
  542.           MID$(WK$,4,2)                                     ' DD
  543.     IF MID$(LM$,3,1) = " " THEN _
  544.        MID$(LM$,3,1) = "0"
  545. 655 IF MID$(LM$,5,1) = " " THEN _
  546.        MID$(LM$,5,1) = "0"
  547. 660 CALL MUZAK (1)
  548.     GOTO 800
  549. 670 GOSUB 12570
  550.     IF FOUND THEN _
  551.        GOSUB 12984 : _
  552.        RETURN 12595
  553.     RETURN
  554. '
  555. ' ****  ACTIVE USER NOT FOUND (NEWUSER ROUTINE)  ***
  556. '
  557. 700 EXPERT.USER = FALSE
  558.     CALL SETEXPERT
  559.     IF MIN.NEWCALLER.BAUD > BAUD.TEST! THEN _                        ' KG090102
  560.        CALL QTPUT ("(" + MID$(STR$(BAUD.TEST!),2) + " BAUD ACCESS FOR REGISTERED USERS ONLY)",2) : _ ' KG090102
  561.        LG$(7) = "NEW CALLER BAUD RESTRICTION" : _
  562.        LOGON.ERROR.INDEX = 7 : _
  563.        GOTO 10620
  564.     CALL QTPUT1 ("User not found")                                   ' KG063001
  565.     GOSUB 12558
  566.     IF NO THEN _
  567.        GOSUB 12990 : _
  568.        GOTO 400
  569.     CALL LINE25
  570.     Z$ = FIRST.NAME$
  571.     GOSUB 670
  572.     Z$ = LAST.NAME$
  573.     GOSUB 670
  574.     Z$ = ACTIVE.USER.NAME$
  575.     GOSUB 670
  576.     TURBO.LOGON = FALSE
  577. 710 IF USER.FILE.INDEX = 0 AND NOT SURVIVE.NOUSER.ROOM THEN _
  578.        GOTO 13540
  579. 720 GOSUB 5370
  580.     IF A THEN _
  581.        USER.SECURITY.LEVEL = SYSOP.SECURITY.LEVEL _
  582.     ELSE USER.SECURITY.LEVEL = DEFAULT.SECURITY.LEVEL
  583. 725 IF USER.SECURITY.LEVEL < MINIMUM.LOGON.SECURITY THEN _
  584.        LOGON.ERROR.INDEX = 1 : _
  585.        GOTO 460
  586.     IF FIRST.NAME$ = LAST.NAME$ THEN _
  587.        CALL QTPUT1 (FIRST.NAME.PROMPT$+"/"+LAST.NAME.PROMPT$+" cannot be same") : _
  588.        LOGON.ERROR.INDEX = 3 : _
  589.        GOTO 10620
  590.     IF NOT REMEMBER.NEW.USERS THEN _
  591.        GOSUB 13700 : _
  592.        USER.FILE.INDEX = 0 : _
  593.        GOSUB 12960: _
  594.        PREV.LAST.ON$ = "00-00-00": _
  595.        GOTO 735
  596.     NEW.USER = TRUE
  597.     CALL OPENUSER (HIGHEST.USER.RECORD)
  598.     GOSUB 9450
  599.     GOSUB 12630
  600.     MID$(USER.RECORD$,START.HASH,LEN.HASH) = LEFT$("NEWUSER",LEN.HASH)
  601.     IF START.INDIV>0 THEN _
  602.        MID$(USER.RECORD$,START.INDIV,LEN.INDIV) = INDIV.VALUE$
  603.     GOSUB 9440
  604. 730 GOSUB 12960
  605. 735 BYPASS.TIME.CHECK = TRUE
  606.     CALL ASKMORE ("",TRUE,TRUE,X,TRUE)
  607.     CALL LINE25
  608.     FILE.NAME$ = NEWUSER.FILE$
  609.     STOP.INTERRUPTS = TRUE
  610.     GOSUB 1790
  611.     CALL SKIPLINE(1)
  612. 739 CALL QTPUT1 (ACTIVE.USER.NAME$ + " from " + CI$)
  613. 740 A$ = "C)hange "+FIRST.NAME.PROMPT$+"/"+LAST.NAME.PROMPT$+"/"+USER.LOCATION$+", D)isconnect, [R]egister"  ' KG063001
  614.     GOSUB 12995
  615.     IF Q = 0 THEN _
  616.        Z$ = "R" _
  617.     ELSE CALL ALLCAPS (B$(1)) : _
  618.          Z$ = B$(1)
  619.     S = INSTR("CDR",Z$)
  620. 745 IF NOT REMEMBER.NEW.USERS THEN _
  621.        ON S GOTO 748,752,754
  622.     ON S GOTO 747,750,760
  623.     GOTO 740
  624. 747 CALL UPDTCALR (ACTIVE.USER.NAME$ + " from " + CI$ + _
  625.                            " changed Name/Address",2)
  626.     MID$(USER.RECORD$,START.HASH,LEN.HASH) = STRING$(LEN.HASH,0)
  627.     GOSUB 9440
  628.     GOSUB 12991
  629. 748 FF = FALSE
  630.     GOTO 400
  631. '
  632. ' ***  D - COMMAND FROM NEWUSER ROUTINE (DISCONNECT - REFUSE TO REGISTER) **
  633. '
  634. 750 CALL UPDTCALR (ACTIVE.USER.NAME$ + " from " + CI$ + _
  635.                            " didn't register",2)
  636.     MID$(USER.RECORD$,START.HASH,LEN.HASH) = STRING$(LEN.HASH,0)
  637.     GOSUB 9440
  638.     GOSUB 12991
  639. 752 FF = FALSE
  640.     USER.FILE.INDEX = 0
  641.     GOTO 13540
  642. '
  643. ' *****  GET AND VERIFY PASSWORD   ****
  644. '
  645. 754 CALL QTPUT1 ("GUEST privileges granted.  RE-REGISTER on future calls")
  646.     USER.SECURITY.SAVE = USER.SECURITY.LEVEL
  647.     GOTO 832
  648. 755 IF PRIVATE.DOOR THEN _
  649.        B$ = PASSWORD$ : _
  650.        Z$ = B$ : _
  651.        RETURN
  652.     GOSUB 12800
  653.     A$ = "Re-Enter PASSWORD for Verification (Dots Echo)"
  654.     GOSUB 45010
  655.     SWAP Z$,B$
  656.     CALL ALLCAPS (Z$)
  657.     IF B$ <> Z$ THEN _
  658.        CALL QTPUT1 ("Passwords Don't Match!") : _
  659.        GOTO 755
  660.     RETURN
  661. '
  662. ' ***  R - COMMAND FROM NEWUSER ROUTINE - REGISTER   **
  663. '
  664. 760 GOSUB 755
  665.     CALL ALLCAPS (Z$)
  666.     LSET PASSWORD$ = Z$
  667.     CALL QTPUT1 ("Please REMEMBER your password")
  668.     USER.TEXT.COLOR = 37
  669.     TEMP.SECURITY.LEVEL = USER.SECURITY.LEVEL
  670.     CALL PROTOCOL
  671.     USER.TRANSFER.DEFAULT$ = "N"
  672.     PROTO.PROMPT$ = "None"
  673.     IF NEWUSER.SETS.DEFAULTS THEN _
  674.        GOSUB 42950 : _
  675.        BYPASS.TIME.CHECK = TRUE : _
  676.        GOSUB 43000 : _
  677.        BYPASS.TIME.CHECK = FALSE : _
  678.        CALL GRAPHIC (USER.GRAPHIC.DEFAULT$,FILE.NAME$) : _
  679.        GOSUB 42805 : _
  680.        GOSUB 42700 _
  681.     ELSE UPPER.CASE = FALSE : _
  682.          HIGHLIGHT.OFF = TRUE : _
  683.          CALL SETUGD (0,USER.GRAPHIC.DEFAULT$) : _
  684.          NULLS = FALSE
  685.     PAGE.LENGTH = PAGE.LENGTH.DEF                                    ' KG080801
  686.     GOSUB 12900
  687.     GOSUB 5135
  688.     CALL DEFAULTU
  689.     FILE.NAME$ = NEW.USER.QUESTIONNAIRE$
  690.     GOSUB 11520
  691.     LSET SECURITY.LEVEL$ = MKI$(USER.SECURITY.LEVEL)
  692.     USER.SECURITY.LEVEL$ = STR$(USER.SECURITY.LEVEL)
  693.     CALL REMOVE (USER.SECURITY.LEVEL$," ")
  694. '
  695. ' ****  LOGIN ALL USERS  ***
  696. '
  697. 800 CALL DOORRTN
  698.     IF ADJUSTED.SECURITY THEN _
  699.        GOSUB 5135
  700.     IF ORIG.CONFIG$ = CURRENT.DEF$ THEN _
  701.        MAIN.USER.FILE.INDEX = USER.FILE.INDEX : _
  702.        ORIG.SECURITY = USER.SECURITY.LEVEL : _
  703.        USER.SECURITY.SAVE = USER.SECURITY.LEVEL : _
  704.         ORIG.FIRST.NAME$ = FIRST.NAME$ : _                          'DGS-ALS
  705.        ORIG.USER.NAME$ = ACTIVE.USER.NAME$
  706.     TIMES.LOGGED.ON = CVI(MID$(USER.OPTIONS$,1,2)) - _
  707.        ((ORIG.CONFIG$ <> CURRENT.DEF$ OR NOT SUB.BOARD) AND _
  708.         (NOT PRIVATE.DOOR) AND (NOT EXIT.TO.DOORS))
  709.     GOSUB 9500
  710.     IF (NOT EXIT.TO.DOORS) AND (NOT SUB.BOARD) THEN _
  711.        CALL UPDTCALR (ACTIVE.USER.NAME$ + " from " + CI$ + _
  712.                  " Lvl" + STR$(USER.SECURITY.LEVEL) + " " + TIME$,2)
  713.     PREV.LAST.ON$ = LAST.DATE.TIME.ON$
  714.     IF LOCAL.USER THEN _
  715.        TALK.TO.MODEM.AT$ = "9600" : _
  716.        BAUD.PARITY$ = "9600 BAUD,N,8,1" : _
  717.        MODEM.INIT.BAUD$ = "9600" : _
  718.        SNOOP = TRUE : _
  719.        LINE.FEEDS = TRUE
  720.     CALL SETCRLF
  721.     CALL CALLOPT
  722.     CALL XFERTYPE (2,TRUE)
  723.     IF NOT SUB.BOARD THEN _
  724.        BOARD.CHECK.DATE$ = PREV.LAST.ON$
  725.     IF PRIVATE.DOOR OR SUB.BOARD THEN _
  726.        GOTO 815
  727.     GOSUB 465
  728.     IF (EIGHT.BIT AND _
  729.        AUTODOWNLOAD.DESIRED) OR _
  730.        ASK.IDENTITY THEN _
  731.        CALL TESTUSER
  732.     CALL QTPUT (FG.1$+"Logging "+FG.4$ + ACTIVE.USER.NAME$,1)
  733.     CALL TALK (1,A$)
  734.     CALL QTPUT (FG.3$+"RBBS-PC " + CX$(4)+VERSION.ID$ +FG.1$+CRLF$+ "NODE " + NODE.ID$ + _
  735.         CX$(1)+ ", OPERATING AT " +FG.2$+ BAUD.PARITY$,1)
  736.     CALL SKIPLINE (1)
  737.     CALL DELAYIT (2)     'PeteEibl 110188
  738.     ATTEMPTS = 0
  739. '
  740. ' *****  NOTIFY CALLER IF ABLE TO "AUTODOWN"  ****
  741. '
  742.     IF EIGHT.BIT AND AUTODOWNLOAD.AVAILABLE THEN _
  743.        A$ = CHR$(9) + _
  744.             RETURN.LINE.FEED$ + _
  745.             "You may use AUTODOWNLOADing!" : _
  746.        CALL RINGCALLER : _
  747.        CALL DELAYIT(4)
  748. 815 DOWNLOADS = CVI(USER.DOWNLOADS$)
  749.     UPLOADS = CVI(USER.UPLOADS$)
  750.        DL.TODAY! = CVS(TODAY.DL$)
  751.        BYTES.TODAY! = CVS(TODAY.BYTES$)
  752.        DLBYTES! = CVS(DL.BYTES$) 
  753.        ULBYTES! = CVS(UL.BYTES$)
  754.     IF CURRENT.DATE$ <> LEFT$(LAST.DATE.TIME.ON.SAVE$,8) THEN  _
  755.        DL.TODAY! = 0 : _
  756.        BYTES.TODAY! = 0
  757.  IF SUB.BOARD THEN _
  758.          GLOBALS.SET = TRUE : _                                   ' GLOBALS FIX
  759.          UPLOADS = GLOBAL.UPLOADS : _                             ' GLOBALS FIX
  760.          DOWNLOADS = GLOBAL.DOWNLOADS : _                         ' GLOBALS FIX
  761.          DL.TODAY! = GLOBAL.DL.TODAY! : _                         ' GLOBALS FIX
  762.          BYTES.TODAY! = GLOBAL.BYTES.TODAY! : _                   ' GLOBALS FIX
  763.          DLBYTES! = GLOBAL.DLBYTES! : _                           ' GLOBALS FIX
  764.          ULBYTES! = GLOBAL.ULBYTES!                               ' GLOBALS FIX
  765.  IF RATIO.RESTRICTION# > 0 THEN _                                 'PE GLOBAL
  766.   IF BYTE.METHOD = 0 AND GLOBAL.UPLOADS < INITIAL.CREDIT# THEN _  'PE GLOBAL
  767.     GLOBAL.UPLOADS = INITIAL.CREDIT# _                           'PE GLOBAL
  768. ELSE IF BYTE.METHOD = 1 AND GLOBAL.ULBYTES! < INITIAL.CREDIT# THEN _ 'PE GLOBAL
  769.        GLOBAL.ULBYTES! = INITIAL.CREDIT#                             'PE GLOBAL
  770.     IF NOT GLOBALS.SET THEN _
  771.        GLOBALS.SET = TRUE : _
  772.        GLOBAL.DOWNLOADS = DOWNLOADS : _
  773.        GLOBAL.UPLOADS = UPLOADS : _
  774.        GLOBAL.DL.TODAY! = DL.TODAY! : _
  775.        GLOBAL.BYTES.TODAY! = BYTES.TODAY! : _
  776.        GLOBAL.DLBYTES! = DLBYTES! : _
  777.        GLOBAL.ULBYTES! = ULBYTES!
  778.     IF RATIO.RESTRICTION# > 0 THEN _    'Pe 09/05/89
  779.        IF BYTE.METHOD = 0 AND UPLOADS < INITIAL.CREDIT# THEN _
  780.           UPLOADS = INITIAL.CREDIT# _
  781.        ELSE IF BYTE.METHOD = 1 AND ULBYTES! < INITIAL.CREDIT# THEN _
  782.                ULBYTES! = INITIAL.CREDIT#
  783.     GOSUB 827                                                        ' KG052101
  784.     LSET USER.OPTIONS$ = MKI$(TIMES.LOGGED.ON) + _
  785.                          MID$(USER.OPTIONS$,3)
  786.     LSET LAST.DATE.TIME.ON$ = CURRENT.DATE$ + _
  787.                               " " + _
  788.                               TIME.LOGGED.ON$
  789.     MID$(USER.RECORD$,START.HASH,LEN.HASH) = HASH.VALUE$
  790.     IF START.INDIV > 0 THEN _
  791.        MID$(USER.RECORD$,START.INDIV,LEN.INDIV) = INDIV.VALUE$
  792.     LSET USER.NAME$ = ORIG.USER.NAME$
  793.     IF (NOT EXIT.TO.DOORS) AND NOT (ORIG.MESSAGE.FILE$ = ACTIVE.MESSAGE.FILE$ AND SUB.BOARD) THEN _
  794.        CALL AUTOPAGE
  795.     IF NOT SUB.BOARD THEN _
  796.        ORIG.USER.FILE.INDEX = USER.FILE.INDEX
  797.     GOSUB 9440
  798.     GOSUB 12991
  799.     CALL ASKMORE ("",TRUE,TRUE,X,TRUE)
  800.     IF TURBO.LOGON THEN _
  801.        GOTO 819
  802.     IF NOT SAME.USER THEN _
  803.        STOP.INTERRUPTS = NOT WELCOME.INTERRUPTABLE : _
  804.        BYPASS.TIME.CHECK = TRUE : _
  805.        FILE.NAME$ = WELCOME.FILE$ : _
  806.        DISPLAY.AS.UNIT = TRUE : _
  807.        GOSUB 1790 : _
  808.        DISPLAY.AS.UNIT = FALSE
  809.     BYPASS.TIME.CHECK = FALSE
  810.     STOP.INTERRUPTS = TRUE
  811.     IF PRIVATE.DOOR OR SUB.BOARD THEN _                    'Pe 04/01/89
  812.        GOTO 816
  813. ' **** added NEWS file here *******
  814.     FILE.NAME$ = WELCOME.FILE.DRV.PATH$ + _
  815.                  "NEWS.DEF"
  816.     CALL FINDIT (FILE.NAME$)
  817.      IF  OK THEN _
  818.      CALL QTPUT (CHR$(12),O) : _                 'Pe 04/01/89
  819.      GOSUB 1790
  820. '*** end of NEWS file mod
  821. '
  822. 816 IF NOT NEW.USER THEN _
  823.        CALL QTPUT(FG.1$+"Times on:" +fg.3$+ STR$(TIMES.LOGGED.ON)+CRLF$ + _
  824.         +CX$(4)+ "Last on  was: "+FG.3$ + PREV.LAST.ON$,1)
  825. 817 IF NOT REMIND.FILE.TRANSFERS OR NEW.USER THEN _
  826.        GOTO 818
  827.     CALL CHECKRATIO (FALSE)
  828. 818  IF INSTR(PREV.USER.NAME$,"SYSOP") THEN _
  829.        GOTO 819
  830.   '   PREV.USER.NAME$ = SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$
  831. '
  832. IF ACTIVE.USER.FILE$ = ORIG.USER.FILE$ THEN _   'Pe 02/11/89
  833.     CALL QTPUT(FG.4$+"Previous caller was: "+FG.2$ + PREV.USER.NAME$+EMPHASIZE.OFF$,1)
  834. 819 CALL ASKMORE ("",TRUE,TRUE,X,TRUE)
  835.     IF REMIND.PROFILE THEN _
  836.        GOSUB 5400 : _
  837.        CALL ASKMORE ("",TRUE,TRUE,X,TRUE)
  838.     CALL TRIM (CI$)
  839.     GOSUB 5370
  840.     IF A THEN _
  841.        ACTIVE.USER.NAME$ = "SYSOP"
  842.     IF (NODE.RECORD.INDEX < 2) THEN _
  843.        GOTO 821
  844.     GOSUB 4910
  845.     GOSUB 24000
  846.     GET 1,NODE.RECORD.INDEX
  847.     MID$(MESSAGE.RECORD$,1,31) = ACTIVE.USER.NAME$ + _
  848.                                  SPACE$(31 - LEN(ACTIVE.USER.NAME$))
  849.     MID$(MESSAGE.RECORD$,40,2) = " 0"
  850.     MID$(MESSAGE.RECORD$,44,2) = STR$(BPS)
  851.     MID$(MESSAGE.RECORD$,55,2) = " 0"
  852.     MID$(MESSAGE.RECORD$,57,1) = "A"
  853.     MID$(MESSAGE.RECORD$,60,5) = TALK.TO.MODEM.AT$ + _
  854.                                  SPACE$(5 - LEN(TALK.TO.MODEM.AT$))
  855.     MID$(MESSAGE.RECORD$,72,2) = " 0"
  856.     MID$(MESSAGE.RECORD$,93,24) = CI$ + _
  857.                                   SPACE$(24)
  858.     PUT 1,NODE.RECORD.INDEX
  859.     GOSUB 12985
  860. 821 IF EXIT.TO.DOORS THEN _
  861.        IF TRANSFER.FUNCTION = 3 THEN _
  862.           NEW.USER = TRUE : _
  863.           TURBO.LOGON = FALSE : _
  864.           SAME.USER = FALSE : _
  865.           TRANSFER.FUNCTION = 0 : _
  866.           GOTO 832 _
  867.        ELSE GOTO 832
  868.     IF (SUB.BOARD AND (ORIG.MESSAGE.FILE$ = ACTIVE.MESSAGE.FILE$)) _
  869.        OR ((USER.SECURITY.LEVEL > MAX.REG.SEC) AND (NOT NEW.USER)) THEN _
  870.        GOTO 832
  871.     Z$ = REGISTRATION.PROGRAM$
  872.     TRANSFER.FUNCTION = 3
  873.     CALL DOOREXIT
  874.     TRANSFER.FUNCTION = 0                                            ' KG072101
  875.     GOTO 832
  876. '
  877. ' ****  ESC PRESSED ON LOCAL CONSOLE ENTERS HERE   ***
  878. '
  879. 822 LOCATE 24,1
  880.     CALL MODEMPUT (MODEM.GO.OFFHOOK.COMMAND$)
  881.     LOCAL.USER = TRUE
  882.     SNOOP = TRUE
  883.     SYSOP = TRUE
  884.     WAIT.BEFORE.DISCONNECT = 32400
  885.     BPS = -6
  886.     CALL COMMINFO
  887.     CALL MUZAK (2)
  888.     IF NOT ESCAPE.INSECURE THEN _
  889.        GOTO 345
  890.     ACTIVE.USER.NAME$ = SYSOP.PASSWORD.1$ + " " + SYSOP.PASSWORD.2$
  891.     FIRST.NAME$ = SYSOP.PASSWORD.1$
  892.     LAST.NAME$ = SYSOP.PASSWORD.2$
  893.     CALL FINDTIME (USER.LOGON.TIME!)
  894.     TIME.LOGGED.ON$ = TIME$
  895.     LINES.PRINTED = 0                                                ' KP062006
  896.     GOTO 457
  897. 825 X = (MAX.PER.DAY - MINUTES.PER.SESSION!)
  898.     X = -X * (X > 0)    ' extra from daily max
  899.     Q! = X + MINUTES.PER.SESSION! + (MAX.PER.DAY > 0) * ELAPSED.TIME
  900.     IF Q! > MINUTES.PER.SESSION! THEN _
  901.        Q! = MINUTES.PER.SESSION!
  902.     SECONDS.PER.SESSION! = Q! * 60 + TIME.CREDITS!                   ' KP061804
  903.     RETURN
  904. 827 IF LAST.MESSAGE.READ > HIGH.MESSAGE.NUMBER THEN _                ' KG052101
  905.        LAST.MESSAGE.READ = 0 : _                                     ' KG052101
  906.        MID$(USER.OPTIONS$,3,2) = MKI$(0)                             ' KG052101
  907.     RETURN                                                           ' KG052101
  908. 832 IF REG.DAYS.REMAINING <= DAYS.TO.WARN AND _
  909.        RESTRICT.BY.DATE AND REG.DAYS.REMAINING > 0 THEN _
  910.        CALL QTPUT1 ("Registration EXPIRES in" + _
  911.                    STR$(REG.DAYS.REMAINING) + " days!") : _
  912.        CALL DELAYIT (5)
  913.     IF (NOT REQ.QUES.ANSWERED) AND _
  914.        REQUIRED.QUESTIONNAIRE$ <> "" THEN _
  915.          FILE.NAME$ = REQUIRED.QUESTIONNAIRE$ : _
  916.          GOSUB 11520 : _
  917.          IF OK THEN _
  918.             REQ.QUES.ANSWERED = TRUE
  919. 837 Z$ = ACTIVE.USER.NAME$ + _
  920.             " on at " + _
  921.             CURRENT.DATE$ + _
  922.             ", " + _
  923.             TIM$ + _
  924.             " from " + _
  925.             CI$ + _
  926.             ", " + _
  927.             BAUD.PARITY$
  928.      NG$ = Z$ + SPACE$(128 - LEN(Z$))
  929.      MESSAGE.USER.NAME$ = LEFT$(ACTIVE.USER.NAME$,22)
  930. '
  931. ' *  ALWAYS RECORD THE HASH/INDIVIDUATING FIELD TO EACH RECORD LOGGED OUT
  932. '
  933.      X$ = "{" + _
  934.           HASH.VALUE$ + _
  935.           "/" + _
  936.           INDIV.VALUE$ + _
  937.           "}"
  938.      IF LEN(Z$) < 65 THEN _
  939.         X = 65 _
  940.      ELSE X = LEN(Z$) + 2
  941.      MID$(NG$,X) = X$
  942.      CALL PRINTIT ("  " + Z$)
  943.      IF NEW.USER THEN _
  944.         CALL UPDTCALR ("NEWUSER",1) : _
  945.         CALL MUZAK (2)
  946. 842 GOSUB 825
  947.     SYSOP = (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL)
  948.     GOSUB 12987
  949.     IF SUB.BOARD THEN _
  950.        GOTO 850
  951.     GOSUB 12986
  952.     GOSUB 23000
  953.     CALLS.TODATE! = CALLS.TODATE! + 1 + (SYSOP OR HAS.DOORED)
  954.     GOSUB 24000
  955.     GOSUB 12985
  956. 850 SUBROUTINE.PARAMETER = 2
  957.     CALL LINE25
  958.     CALL SKIPLINE (1)
  959.     IF TURBO.LOGON THEN _
  960.        BULLETIN.SAVE$ = BULLETIN.MENU$ : _
  961.        GOTO 900
  962.     CALL CTNEWFILES (BOARD.CHECK.DATE$,M(),LAST.NEW,A$)
  963.     IF NEW.USER OR LAST.NEW < 1 OR NOT NEW.FILES.CHECK THEN _
  964.        GOTO 852                                                ' Pe 09/09/89
  965.     IF FMS.DIRECTORY$ <> "" THEN _
  966. CALL QTPUT(CX$(1)+A$ + FG.1$+STR$(LAST.NEW) + FG.2$+" NEW file(s) since last on"+EMPHASIZE.OFF$,1) _
  967.     ELSE GOTO 852
  968.     L = LEN(DOWNLOAD.DRIVES$)
  969.     OSS = 19
  970.     IF (NOT SKIP.FILES.LOGON) AND _
  971.        (USER.SECURITY.LEVEL >= MIN.SEC.TO.VIEW) AND _
  972.        USER.SECURITY.LEVEL >= OPT.SEC(OSS) THEN _
  973.           A$ = "Review new files to download ([Y],N)" : _
  974.           GOSUB 12999 : _
  975.           IF NOT NO THEN _
  976.              LAST.INDEX = 3 : _                                      ' KG081201
  977.              ANS.INDEX = 1 : _                                       ' KG081201
  978.              Q = 3 : _                                               ' KG081201
  979.              B$(2) = MID$(BOARD.CHECK.DATE$,1,2) + _
  980.                      MID$(BOARD.CHECK.DATE$,4,2) + _
  981.                      MID$(BOARD.CHECK.DATE$,7,2) : _
  982.              Y$ = B$(3) : _
  983.              CALL BRKFNAME (FMS.DIRECTORY$,DR$,Y$,X$,FALSE) : _
  984.              B$(3) = Y$ : _
  985.              TIME.LOCK.EXEMPT = TRUE : _
  986.              GOSUB 20185 : _
  987.              LAST.INDEX = 0 : _                                      ' KG081201
  988.              TIME.LOCK.EXEMPT = FALSE
  989. 852 STOP.INTERRUPTS = FALSE
  990.     SYSOP = (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL)
  991.     IF USER.SECURITY.LEVEL < OPT.SEC (2) OR _
  992.        ACTIVE.BULLETINS < 1 OR _
  993.        SYSOP OR _
  994.        SAME.USER THEN _
  995.           GOTO 900
  996.     IF BULLETIN.MENU$ = BULLETIN.SAVE$ THEN _
  997.         GOTO 900
  998.     BULLETIN.SAVE$ = BULLETIN.MENU$
  999. 855 CALL ASKMORE ("",TRUE,TRUE,X,TRUE)
  1000.     IF BULLETINS.OPTIONAL AND NOT NEW.USER THEN _
  1001.        GOTO 856
  1002.     STOP.INTERRUPTS = TRUE
  1003.     NEW.USER = FALSE
  1004.     GOSUB 9700
  1005.     STOP.INTERRUPTS = FALSE
  1006.     GOTO 900
  1007. 856 IF NOT CHECK.BULLETIN.LOGON THEN _
  1008.        ANS.INDEX = 0 : _
  1009.        GOSUB 9760 : _
  1010.        GOTO 900
  1011.     CALL SKIPLINE (1)
  1012.     A$ = "Skip the bulletins (Y,[N])"
  1013.     GOSUB 12999
  1014.     IF YES THEN _
  1015.        GOTO 900
  1016. 860 NEW.USER = FALSE
  1017.     GOSUB 9700
  1018. 900 NEW.USER = FALSE
  1019.     ACTION.FLAG = (LOGON.MAIL.LEVEL$ = "S")
  1020.     LOGON.MAIL.NEW = (LOGON.MAIL.LEVEL$ = "N")
  1021.     GOSUB 1895
  1022.     IF ACTIVE.USER.NAME$ = "SYSOP" AND NOT SYSOP THEN _
  1023.        ACTIVE.USER.NAME$ = ORIG.USER.NAME$
  1024.     LOGON.MAIL.NEW = FALSE
  1025.     SUBROUTINE.PARAMETER = 2
  1026.     CALL LINE25
  1027.     SECTION$ = "    "
  1028.     A$ = ""
  1029.     IF (NOT CONFERENCE.MODE) AND (NOT SUB.BOARD) AND NOT TURBO.LOGON THEN _
  1030.        MAILCHECK.CONFIRM = TRUE : _
  1031.        NON.STOP = TRUE : _
  1032.        GOSUB 5800
  1033.     MAILCHECK.CONFIRM = FALSE
  1034.     Q! = MINUTES.IN.DOORS * 60
  1035.     EXIT.TO.DOORS = FALSE
  1036.     GOSUB 2350
  1037.     IF NOT PRIVATE.DOOR THEN _
  1038.        GOTO 955
  1039.     GOSUB 20165
  1040.     CALL SETSECT
  1041.     PRIVATE.DOOR = FALSE
  1042.     GOTO 1205
  1043. 955 IF NOT TURBO.LOGON THEN _
  1044.        GOSUB 4850 : _                 'Pe askmail
  1045.  IF STR$(LAST.MESSAGE.READ) < STR$(HIGH.MESSAGE.NUMBER) AND USER.SECURITY.LEVEL => MESSAGE.SECURITY THEN _    'Pe 01/29/89
  1046.      GOSUB 4275                                 'PEASKMAIL
  1047.     TURBO.LOGON = FALSE
  1048. '
  1049. ' *                           COMMAND PROCESSING
  1050. '
  1051. 1200 CLOSE 1
  1052.      GOSUB 1280
  1053. 1205 IF SUBROUTINE.PARAMETER < 0 THEN _                              ' KG072502
  1054.         GOTO 202                                                     ' KG052005
  1055.      SUBROUTINE.PARAMETER = 1
  1056.      STOP.INTERRUPTS = FALSE
  1057.      NON.STOP = (PAGE.LENGTH < 1)                                    ' KG072603
  1058.      Q = 0
  1059.      IF HOME.CONFERENCE$ <> "" AND HOME.CONFERENCE$ <> "MAIN" THEN _
  1060.         TURBO.LOGON = (NOT CONFMAIL.JOIN) : _
  1061.         CONFMAIL.JOIN = FALSE : _
  1062.         FF = 8 : _
  1063.         B$(2) = HOME.CONFERENCE$ : _
  1064.         HOME.CONFERENCE$ = "" : _
  1065.         Q = 1 : _
  1066.         ANS.INDEX = 1 : _                                            ' KG081201
  1067.         LAST.INDEX = 2 : _                                           ' KG081201
  1068.         GOTO 1240
  1069.      CALL SKIPLINE (1)
  1070. 1210 GOSUB 41000
  1071.      IF ANS.INDEX < LAST.INDEX THEN _                                ' KG081201
  1072.         GOTO 1232
  1073.      CALL TALK (10,A$)
  1074. '
  1075.      IF EXPERT.USER THEN _
  1076.         GOTO 1230
  1077. 1212 LINES.PRINTED = -MENUS.CAN.PAUSE * LINES.PRINTED
  1078.      IF CUSTOM.PUI THEN _
  1079.         GOTO 1230
  1080.      IF SUB.SECTION < BEG.FILE THEN _
  1081.         IF USER.SECURITY.LEVEL >= SYSOP.MENU.SECURITY.LEVEL THEN _
  1082.            FILE.NAME$ = MENU$(1) : _
  1083.            GOSUB 43025
  1084.      FILE.NAME$ = MENU$(MENU.INDEX)
  1085.      DELETE.INVALID = TRUE
  1086.      GOSUB 43025
  1087.      DELETE.INVALID = FALSE
  1088. 1230 CALL LINE25
  1089.      CALL SKIPLINE (1)
  1090.      IF CONFERENCE.MODE THEN _
  1091.         A$ = GRN$ : _
  1092.         GOSUB 12979 : _
  1093.         CALL TALK (65,GRN$)
  1094.      IF MENU.INDEX = 6 THEN _                                        ' KG081201
  1095.         SUBROUTINE.PARAMETER = 1 : _                                 ' KG081201
  1096.         CALL LIBRARY                                                 ' KG081201
  1097.      CALL TALK (MENU.INDEX, A$)                                      ' KG081201
  1098. 1232 IF CUSTOM.PUI THEN _                                            ' KG081201
  1099.         CALL USERFACE (USER.GRAPHIC.DEFAULT$) : _
  1100.         GOSUB 12997 : _
  1101.         GOTO 1235
  1102.      POSSIBLE.MACRO = TRUE
  1103.      CALL DISPLAYTR (TIME.REMAINING!) 'Pe time mod
  1104.      A$ = COMMAND.PROMPT$
  1105.      GOSUB 12930                                                     ' KG081201
  1106.      IF Q = 0 THEN _
  1107.         GOTO 1230
  1108. 1235 Z$ = B$(ANS.INDEX)                                              ' KG081201
  1109.      IF LEN(Z$) < 1 THEN _
  1110.         GOTO 1230
  1111.      CALL SRCHCMND (SUB.SECTION,FF)
  1112.      IF FF < 1 THEN _
  1113.         CALL QTPUT (CX$(1)+"Unknown"+fg.3$+" command"+EMPHASIZE.OFF$+" <"+Z$+">",1) : _
  1114.         GOTO 1230
  1115.      CALL TALK (65,"OPTION "+Z$+" SELECTED")
  1116. 1240 IF USER.SECURITY.LEVEL < OPT.SEC(FF) THEN _
  1117.         VIOLATION$ = SECTION$ + _
  1118.                      " " + _
  1119.                      Z$ : _
  1120.         GOSUB 1380 : _
  1121.         GOTO 1205
  1122.      IF FF > 39 THEN _
  1123.         DIRECTORY.EXTENTION$ = LIBRARY.DIRECTORY.EXTENTION$ _
  1124.      ELSE DIRECTORY.EXTENTION$ = MAIN.DIRECTORY.EXTENTION$           ' KG081201
  1125.      CALL QTPUT (CHR$(12),1)                           'PE  CLS Mod
  1126.         ON FF GOSUB _
  1127.                  1400, _      ' 1  A)nswer questionnaire 1
  1128.                  9700, _      ' 2  B)ulletins
  1129.                  1800, _      ' 3  C)omments
  1130.                  10970, _     ' 4  D)oor (exit to)
  1131.                  2000, _      ' 5  E)nter a message
  1132.                  1275, _      ' 6  F)ile system (exit to)
  1133.                  1525, _      ' 7  I)nitial welcome redisplayed 'Pe 04/01/89
  1134.                  5300, _      ' 8  J)oin a conference
  1135.                  3900, _      ' 9  K)ill a message
  1136.                  4700, _      '10  O)perator page
  1137.                  1892, _      '11  P)ersonal mail (look for) 'pe 02/11/89
  1138.                  4330, _      '12  R)ead messages
  1139.                  4340, _      '13  S)can message headers
  1140.                  4320, _      '14  T)opic msg scan
  1141.                  1285, _      '15  U)tilities (exit to)
  1142.                  5800, _      '16  V)iew a conference
  1143.                  9800, _      '17  W)ho's on other nodes displayed
  1144.                  1283, _      '18  @)Library (exit to) 18
  1145.                 20160, _      '19  D)ownload
  1146.                 10570, _      '20  G)oodbye
  1147.                 20155, _      '21  L)ist
  1148.                 20185, _      '22  N)ew
  1149.                 20180, _      '23  P)ersonal files
  1150.                 20175, _      '24  S)can
  1151.                 20170, _      '25  U)pload
  1152.                 20140, _      '26  V)iew ARC Contents
  1153.                  5500, _      '27  B)aud rate change 300==>450 1
  1154.                  9099, _      '28  C)lock (time & time on)  'Pe 02/11/89
  1155.                  42850, _     '29  E)cho selection
  1156.                  42800, _     '30  F)ile transfer protocol
  1157.                  43000, _     '31  G)raphics
  1158.                  5200, _      '32  L)ines per page
  1159.                  10925, _     '33  M)essage margin
  1160.                  5110, _      '34  P)assword change
  1161.                  5450, _      '35  R)eview preferences   'Pe 02/11/89
  1162.                  4849, _      '36  S)tatistics displayed  'Pe 02/11/89
  1163.                  1500, _      '37  T)oggle
  1164.                  10090, _     '38  U)serlog displayed 12
  1165.                  30000, _     '39  A)rchive a Library disk 1
  1166.                  30100, _     '40  C)hange a Library disk
  1167.                  30200, _     '41  D)ownload Library files
  1168.                  10570, _     '42  G)oodbye
  1169.                  20155, _     '43  L)ist a Library directory
  1170.                  20175, _     '44  S)can a Library disk directory
  1171.                  20140, _     '45  V)iew arc contents 7
  1172.                  1325, _      '45  H)elp 1
  1173.                  1330, _      '46  ?)help
  1174.                  1250, _      '49  Q)uit
  1175.                  4240, _      '50  X)expert toggle on/off 4
  1176.                  10070, _     '51  1) List comments file 1
  1177.                  10090, _     '52  2) List callers file
  1178.                  10390, _     '53  3) Recover a message
  1179.                  10530, _     '54  4) Erase comments
  1180.                  11000, _     '55  5) User file maintenance
  1181.                   4130, _     '56  6) Toggle page bell on/off
  1182.                  10930        '57  7) Exit to DOS 2.x or above 7
  1183.      GOTO 1205
  1184. '
  1185. ' ****           QUIT COMMAND (GLOBAL)              ***
  1186. '
  1187. 1250 IF EXPERT.USER THEN _                                           ' KG081201
  1188.         A$ = QUIT.PROMPT.EXPERT$ _
  1189.      ELSE A$ = QUIT.PROMPT.NOVICE$
  1190.      GOSUB 12930                                                     ' KG081201
  1191.      IF Q = 0 THEN _
  1192.         B$(ANS.INDEX) = "M"                                          ' KG081201
  1193.      Z$ = B$(ANS.INDEX)                                              ' KG081201
  1194.      CALL ALLCAPS (Z$)
  1195.      IF Z$ = "C" THEN _
  1196.         Z$ = "M" : _
  1197.         GOTO 5323
  1198.      IF Z$ <> SPACE$(LEN(Z$)) THEN _
  1199.         ON INSTR(QUIT.LIST$,Z$) GOTO 1275,1280,1285,10570,1283
  1200.      GOTO 1250                                                       ' KG081201
  1201. 1275 MENU.INDEX = 3
  1202.      GOTO 1295
  1203. 1280 MENU.INDEX = 2
  1204.      GOTO 1295
  1205. 1283 MENU.INDEX = 6
  1206.      ACTIVE.FMS.DIRECTORY$ = ""
  1207.      GOTO 1295
  1208. 1285 MENU.INDEX = 4
  1209. 1295 CALL SETSECT
  1210.      RETURN
  1211. 1300 CALL QTPUT (FG.1$+"Message base "+FG.2$ + GRN$,1)
  1212.      RETURN
  1213. '
  1214. ' **** COMMON LOCAL DISPLAY PRINT  ***
  1215. '
  1216. 1315 NUM.RETURNS = 1
  1217. 1320 CALL LPRNT(D$,NUM.RETURNS)
  1218.      RETURN
  1219. '
  1220. ' ******            HELP (GLOBAL)           ****
  1221. '
  1222. 1325 CALL VIEWHELP (SUB.SECTION,USER.GRAPHIC.DEFAULT$, _
  1223.                 MID$("MAINFILEUTILMAINLIBR",4 * MENU.INDEX - 7,4))
  1224.      IF SUBROUTINE.PARAMETER = -1 THEN _
  1225.         RETURN 10595
  1226.      RETURN
  1227. 1330 IF EXPERT.USER THEN _
  1228.         RETURN 1212
  1229.      GOTO 1325
  1230. '
  1231. ' *****  RECORD SECURITY VIOLATIONS   ****
  1232. '
  1233. 1380 CALL SVIOLATION
  1234.      IF NOT DENY.ACCESS THEN _
  1235.         RETURN
  1236. 1386 CALL DENYACCESS
  1237.      GOTO 10620
  1238. 1397 A$ = "Sorry, " + _
  1239.           FIRST.NAME$ + _
  1240.           ", " + _
  1241.           A$
  1242.      GOTO 12975
  1243. '
  1244. ' ***  A - answer questionnaire                                      ' KG081004
  1245. '
  1246. 1400 A1$ = ANS.MENU$
  1247.      CALL TALK (13,A$)
  1248.      RETURN.TO.PROMPT = (Q > 1)
  1249. 1401 CALL SUBMENU ("Which questionnaire(s), L)ist" + PRESS.ENTER.EXPERT$, _
  1250.         A1$,QUES.PATH$,".DEF","",USER.GRAPHIC.DEFAULT$,TRUE,FALSE,TRUE,"")
  1251.      IF Q = 0 THEN _
  1252.         RETURN
  1253.      IF SUBROUTINE.PARAMETER = -1 THEN _
  1254.         RETURN 10595
  1255.      QUESTIONNAIRE.HOLD$ = Z$
  1256.      GOSUB 11520
  1257.      CLOSE 2
  1258.      CALL UPDTCALR (QUESTIONNAIRE.HOLD$ + " questionnaire " + _
  1259.         MID$("answeredaborted",1 - 8 * QUESTIONNAIRE.ABORTED,8),2)   ' KG081201
  1260.      IF RETURN.TO.PROMPT THEN _
  1261.         RETURN
  1262.      GOTO 1401                                                       ' KG081201
  1263. '
  1264. ' *****    TOGGLE COMMAND (UTILITIES)     ****
  1265. '
  1266. 1500 IF ANS.INDEX < LAST.INDEX THEN _                                ' KG081201
  1267.         GOTO 1510                                                    ' KG081201
  1268.      A$ = "A)utodwnld   B)ullet  C)ase     F)ile   H)ilite"          
  1269.      CALL COLORPMT (A$)
  1270.      CALL QTPUT1 (A$)
  1271.      A$ = "L)ine feeds  N)ulls   T)urboKey X)pert  !)bell"
  1272.      CALL COLORPMT (A$)
  1273.      CALL QTPUT1 (A$)
  1274.      A$ = "TOGGLE which options on/off?" + PRESS.ENTER$
  1275. 1510 GOSUB 12930                                                     ' KG081201
  1276.      IF Q=0 THEN _
  1277.         RETURN                                                       ' KG081201
  1278.      Z$ = B$(ANS.INDEX)                                              ' KG081201
  1279.      CALL ALLCAPS (Z$)
  1280.      FF = INSTR("ABCFHLNTX!",Z$)
  1281.      IF FF < 1 THEN _
  1282.         GOTO 1500                                                    ' KG081201
  1283.      CALL TOGGLE (FF)                                                ' KG081201
  1284.      GOSUB 12997                                                     ' KG081201
  1285.      GOTO 1500                                                       ' KG081201
  1286. '
  1287. ' ****  I - COMMAND FROM MAIN MENU (DISPLAY INITIAL WELCOME)  ***
  1288. '
  1289. 1525 CALL SKIPLINE(2)
  1290.      CALL QTPUT(FG.1$+"Review System Screens Available:",1)
  1291.      CALL QTPUT(FG.4$+"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",2)
  1292.      CALL QTPUT(FG.2$+"P)relog Screen",1)
  1293.      CALL QTPUT(FG.3$+"W)elcome Screen",1)
  1294.      CALL QTPUT(FG.4$+"O)nline News Screens",1)
  1295.      CALL QTPUT(FG.1$+"Y)our Access Level",1)
  1296.      CALL QTPUT(FG.2$+"N)ew User Sign-On",1)
  1297.      CALL QTPUT(CX$(1)+"[Q]uit"+EMPHASIZE.OFF$,2)
  1298. A$ = "Please make a Selection (P,W,O,Y,N,[Q]) "
  1299.         SUBROUTINE.PARAMETER = 1
  1300.         TURBO.KEY = -TURBO.KEY.USER
  1301.         CALL TGET
  1302.         CALL ALLCAPS (B$)
  1303.         X = INSTR("PWOYNQ",B$)
  1304.         IF B$ = "" THEN _
  1305.            GOTO 1596
  1306.     ON X GOTO 1530,1533,1536,1539,1541,1596
  1307. 1530 FILE.NAME$ = PRELOG$
  1308.      GOTO 1550
  1309. 1533 FILE.NAME$ = WELCOME.FILE$
  1310.      GOTO 1550  
  1311. 1536 FILE.NAME$ = WELCOME.FILE.DRV.PATH$ + _
  1312.     "NEWS.DEF"
  1313.      GOTO 1550
  1314. 1539 GOSUB 465 
  1315.      GOTO 1525
  1316. 1541 FILE.NAME$ = NEWUSER.FILE$
  1317. 1550 GOSUB 1790
  1318.      CALL ASKMORE ("",TRUE,FALSE,X,TRUE)
  1319.      GOTO 1525
  1320. 1596 RETURN
  1321. '
  1322. 1790 CALL GRAPHIC (USER.GRAPHIC.DEFAULT$,FILE.NAME$)
  1323.      CALL BUFFILE (FILE.NAME$,X)
  1324.      CALL CARRIER
  1325.      IF SUBROUTINE.PARAMETER = -1 THEN _
  1326.         RETURN 10595
  1327.      RETURN
  1328. '
  1329. ' ***  C - COMMAND FROM MAIN MENU (LEAVE COMMENT FOR SYSOP)   **
  1330. '
  1331. 1800 MESSAGE.TO$ = "SYSOP"
  1332.      ORIG.SUBJECT$ = "COMMENT"
  1333.      GOSUB 1893
  1334.      IF (ACTIVE.MESSAGES >= MAXIMUM.MESSAGES OR _
  1335.         ((NOT MESSAGES.CAN.GROW) AND _                               ' KG053001
  1336.         (NEXT.MESSAGE.RECORD + 5 > HIGHEST.MESSAGE.RECORD)) OR _     ' KG053001
  1337.         NOT COMMENTS.AS.MESSAGES ) THEN _
  1338.         A$ = "Want a REPLY?  Use "+MID$(ALL.OPTS$,5,1)+" instead.  Leave a comment? (Y/[N])" : _
  1339.         GOSUB 12999 : _
  1340.         IF NOT YES THEN _
  1341.            CALL SKIPLINE (1) : _
  1342.            RETURN _
  1343.         ELSE SYSOP.COMMENT = TRUE : _
  1344.              GOTO 2007
  1345.      SYSOP.COMMENT = FALSE
  1346.      SYSOP.MESSAGE = TRUE
  1347.      MSG.HEADER$ = "comment"                                         ' KG072003
  1348.      GOTO 2010
  1349. 1850 BX = &H3
  1350.      EN$ = COMMENTS.FILE$
  1351.      GOSUB 12992
  1352.      CALL OPENWRKA (COMMENTS.FILE$)
  1353.      A$ = FG.1$+FIRST.NAME$+FG.2$ + _
  1354.           ", Thanks for comments!"
  1355.      GOSUB 12976                                                     ' KG061203
  1356.      CALL AMORPM
  1357.      CALL PRNTWRKA (ACTIVE.USER.NAME$+" "+CURRENT.DATE$+" "+TIM$+" Node "+NODE.ID$)
  1358.      FOR X = 1 TO LINES.IN.MESSAGE
  1359.         CALL PRNTWRKA (A$(X))
  1360.      NEXT
  1361.      CALL PRNTWRKA (CARRIAGE.RETURN$)
  1362.      CLOSE 2
  1363.      IF EC <> 0 THEN _
  1364.         EL = 1850 : _
  1365.         GOTO 13000
  1366.      BX = &H3
  1367.      EN$ = COMMENTS.FILE$
  1368.      GOSUB 12993
  1369.      CALL UPDTCALR ("Left comment",1)
  1370.      REDIM A$(ADIM)
  1371.    IF LOGOFF$ = "G" THEN 10562           'Pe 02/04/89
  1372.      RETURN
  1373. '
  1374. ' ****  P - COMMAND FROM MAIN MENU (DISPLAY PERSONAL MAIL)  ****
  1375. '
  1376. 1892 GOSUB 1900                            'Pe 02/11/89
  1377.      CALL ASKMORE ("",TRUE,FALSE,X,TRUE)   'Pe 02/11/89
  1378.      RETURN                                'Pe 02/11/89
  1379. 1893 ACTION.FLAG = TRUE
  1380.      GOTO 1897
  1381. 1895 IF TURBO.LOGON THEN _
  1382.         RETURN
  1383.      B$(0) = LEFT$("NEW ",-4*LOGON.MAIL.NEW)
  1384. 1897 IF ACTIVE.MESSAGE.FILE$ = PREV.BASE$ THEN _
  1385.         ACTION.FLAG = FALSE : _
  1386.         RETURN
  1387. 1900 GOSUB 5344
  1388.      IF PRIVATE.DOOR THEN _
  1389.         ACTION.FLAG = TRUE
  1390.      PREV.BASE$ = ACTIVE.MESSAGE.FILE$
  1391.      SHOW.ACTIVE = FALSE
  1392.      IF NOT ACTION.FLAG THEN _
  1393. CALL QTPUT (FG.4$+"Checking "+FG.3$+" messages in "+EMPHASIZE.OFF$ + GRN.NAME$,0) : _
  1394.         SHOW.ACTIVE = TRUE _
  1395.      ELSE CALL QTPUT (CX$(1)+"Loading messages"+EMPHASIZE.OFF$,0)
  1396.      B$ = ""                                                         ' KG081201
  1397.      I = 0
  1398.      MESSAGES.FROM.USER = FALSE
  1399.      ACTIVE.MESSAGES = 0
  1400.      MAIL.REPORTED = ACTION.FLAG
  1401.      FIRST.OLD = TRUE
  1402.      GOSUB 23000
  1403.      MESSAGE.RECORD = FIRST.MESSAGE.RECORD
  1404.      ACTIVE.DELAY! = 0
  1405.      MAXIMUM.MESSAGES = VAL(MID$(MESSAGE.RECORD$,89,7))
  1406.      IF MAXIMUM.MESSAGES > MM THEN _
  1407.         MAXIMUM.MESSAGES = MM
  1408.      REDIM M(MAXIMUM.MESSAGES,2)
  1409.      NUM.DOTS = 0
  1410. 1905 GET 1,MESSAGE.RECORD
  1411.      CALL CHECKINT (MID$(MESSAGE.RECORD$,117,4))
  1412.      IF EC <> 0 THEN _
  1413.         EL = 1905 : _
  1414.         GOTO 13000
  1415.      NUMBER.RECORDS.IN.MESSAGE = VAL(MID$(MESSAGE.RECORD$,117,4))
  1416.      IF NUMBER.RECORDS.IN.MESSAGE < 1 THEN _
  1417.         NUMBER.RECORDS.IN.MESSAGE = 1
  1418. 1906 IF ACTION.FLAG OR (FIRST.OLD AND NOT MAIL.REPORTED) THEN _
  1419.         CALL MARKTIME (NUM.DOTS)
  1420.      CALL CARRIER
  1421.      IF SUBROUTINE.PARAMETER = -1 THEN _
  1422.         RETURN 10595
  1423. 1910 IF MESSAGE.RECORD >= NEXT.MESSAGE.RECORD THEN _
  1424.         LOW.MESSAGE.NUMBER = M(1,2) : _
  1425.         GOTO 1950
  1426. 1915 IF MID$(MESSAGE.RECORD$,116,1) = DELETED.MESSAGE$ OR _
  1427.         MID$(MESSAGE.RECORD$,116,1) <> ACTIVE.MESSAGE$ THEN _
  1428.         GOTO 1946
  1429.      X$ = MID$(MESSAGE.RECORD$,121,2)
  1430.      IF X$ <> "  " THEN _
  1431.         IF CVI(X$) > USER.SECURITY.LEVEL THEN _
  1432.            GOTO 1945
  1433.      IF ACTION.FLAG THEN _
  1434.         GOTO 1935
  1435. '
  1436. ' ** ALLOW USERS WITH NAMES LONGER THAN 22 CHARS TO RECEIVE PRIVATE MAIL *
  1437. '
  1438. 1920 X$ = MID$(MESSAGE.RECORD$,37,22)
  1439.      IF INSTR(X$,MESSAGE.USER.NAME$) OR _
  1440.     (INSTR(ACTIVE.USER.NAME$,CHR$(32)) > 1 AND _              'DGS-ALS
  1441.      INSTR(X$,LEFT$(ACTIVE.USER.NAME$,22))) OR _              'DGS-ALS
  1442.         (SYSOP AND INSTR(X$,"SYSOP")) OR _
  1443.         (SYSOP AND INSTR(X$,SYSOP.FULL.NAME$)) THEN _
  1444.         GOTO 1925
  1445.      GOTO 1935
  1446. 1925 A = VAL(MID$(MESSAGE.RECORD$,2,4))
  1447.      IF LOGON.MAIL.NEW THEN _
  1448.         IF A <= LAST.MESSAGE.READ THEN _
  1449.            GOTO 1935
  1450.      IF NOT SHOW.ACTIVE THEN _
  1451.         GOTO 1930
  1452.      MAIL.REPORTED = TRUE
  1453.      FIRST.NEW = (A > LAST.MESSAGE.READ)
  1454.      IF FIRST.NEW THEN _
  1455.         I = 0 : _
  1456.         CALL SKIPLINE (1) : _
  1457. CALL QTPUT1 (CHR$(7)+CX$(1)+"NEW"+FG.2$+" Mail for YOU"+FG.1$+" (* = Private)"+EMPHASIZE.OFF$) _
  1458.      ELSE IF FIRST.OLD THEN _
  1459.              CALL SKIPLINE (1) : _
  1460.              CALL QTPUT1 (CHR$(7)+FG.1$+"OLD"+FG.2$+" Mail for YOU (* = Private)"+EMPHASIZE.OFF$): _
  1461.              FIRST.OLD = FALSE
  1462.      SHOW.ACTIVE = NOT FIRST.NEW
  1463. 1930 CALL QTPUT (LEFT$(MESSAGE.RECORD$,5),0)
  1464.      I = I + 1
  1465.      IF I MOD 15 = 0 THEN _
  1466.         CALL SKIPLINE (1)
  1467. 1935 X$ = MID$(MESSAGE.RECORD$,6,31)
  1468.      IF INSTR(X$,ACTIVE.USER.NAME$) OR _
  1469.     (INSTR(ORIG.USER.NAME$,CHR$(32)) > 1 AND _                 'DGS-ALS
  1470.      INSTR(MID$(MESSAGE.RECORD$,6,31),ORIG.USER.NAME$)) OR _   'DGS-ALS
  1471.         (SYSOP AND INSTR(X$,"SYSOP")) OR _
  1472.         (SYSOP AND INSTR(X$,SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$)) THEN _
  1473.         GOTO 1940
  1474.      GOTO 1945
  1475. 1940 IF MESSAGES.FROM.USER < ADIM THEN _
  1476.         MESSAGES.FROM.USER = MESSAGES.FROM.USER + 1 : _
  1477.         B$ = B$ + LEFT$(MESSAGE.RECORD$,5)                           ' KG081201
  1478. 1945 ACTIVE.MESSAGES = ACTIVE.MESSAGES + 1
  1479.      M(ACTIVE.MESSAGES,1) = MESSAGE.RECORD
  1480.      M(ACTIVE.MESSAGES,2) = VAL(MID$(MESSAGE.RECORD$,2,4))
  1481. 1946 MESSAGE.RECORD = MESSAGE.RECORD + NUMBER.RECORDS.IN.MESSAGE
  1482.      GOTO 1905
  1483. 1950 IF NOT MAIL.REPORTED THEN _
  1484.         A$ = CX$(1)+"Sorry, "+FG.2$ + _
  1485.              FIRST.NAME$ +FG.1$+ _
  1486.              ", NO "+FG.3$ + B$(0) +EMPHASIZE.OFF$+ "MAIL for you" : _
  1487.         GOSUB 12975
  1488.      IF MESSAGES.FROM.USER = 0 OR NOT MESSAGE.REMINDER THEN _
  1489.         GOTO 1961
  1490.      IF ACTION.FLAG THEN _
  1491.         GOTO 1961
  1492.      A$ = FG.2$ + "Mail you left"
  1493.      GOSUB 12976
  1494. 1960 K = 1                                                           ' KG081201
  1495.      FOR I = 1 TO MESSAGES.FROM.USER                                 ' KG081201
  1496.         A$ = MID$(B$,K,5)                                            ' KG081201
  1497.         K = K + 5                                                    ' KG081201
  1498.         GOSUB 12978
  1499.         IF I MOD 15 = 0 THEN _
  1500.            CALL SKIPLINE (1)
  1501.      NEXT
  1502.      B$ = ""                                                         ' KG081201
  1503.      CALL SKIPLINE (1)
  1504. CALL QTPUT1 (FG.1$+"Please"+FG.3$+" <K>ill"+FG.2$+" old/unneeded messages"+EMPHASIZE.OFF$)
  1505. 1961 ACTION.FLAG = FALSE                                             ' KG081201
  1506.      CALL SKIPLINE (1)
  1507.      RETURN
  1508. '
  1509. ' ****  E - COMMAND FROM MAIN MENU (ENTER MESSAGE)  ***
  1510. '
  1511. 2000 QUOTED.REPLY = FALSE
  1512. 2001 IF (LOW.MESSAGE.NUMBER > 0 AND ACTIVE.MESSAGES = MAXIMUM.MESSAGES) _ ' KB060901
  1513.         OR HIGH.MESSAGE.NUMBER >= 9999 THEN _                        ' BK060901
  1514.         IF ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$ AND _
  1515.            ACTIVE.MESSAGES = 1 THEN _
  1516.            GOTO 5300 _
  1517.         ELSE A$ = "No room for NEW messages!  Try tomorrow" : _
  1518.              GOSUB 12975 : _
  1519.              GOTO 3650
  1520. 2006 MESSAGE.PASSWORD$ = ""
  1521.      SYSOP.COMMENT = FALSE
  1522. '* ------[ first line different ]------
  1523.      IF RE.EDIT = TRUE THEN _                    'BK012301
  1524.     GOTO 2007                        'BK012301
  1525. '
  1526.      IF REPLY THEN _                                                 ' KG082901
  1527.         SAVE.ANS.INDEX = ANS.INDEX _                                 ' KG082901
  1528.      ELSE MESSAGE.TO$ = ""                                           ' KG082901
  1529. 2007 IF SYSOP.COMMENT THEN _
  1530.         Z$ = COMMENTS.FILE$ : _
  1531.         MSG.HEADER$ = "comment" _                                    ' KG072003
  1532.      ELSE Z$ = ACTIVE.MESSAGE.FILE$ : _
  1533.           MSG.HEADER$ = "message"                                    ' KG072003
  1534. 2008 IF SYSOP.COMMENT OR MESSAGES.CAN.GROW THEN _
  1535.         Y$ = "on disk" : _
  1536.         CALL FINDFREE : _
  1537.         GOTO 2009
  1538.      IF NEXT.MESSAGE.RECORD + 3 < HIGHEST.MESSAGE.RECORD THEN _
  1539.         GOTO 2010
  1540.      Y$ = "in file"
  1541.      FREE.SPACE$ = "1"
  1542. 2009 IF VAL(FREE.SPACE$) >= 2000 THEN _
  1543.         GOTO 2010
  1544.      A$ = "No room " + Y$ + " for " + MSG.HEADER$                    ' KG072003
  1545.      GOSUB 12979
  1546.      GOTO 3650
  1547. 2010 IF QUOTED.REPLY = TRUE OR _                'BK012301
  1548.     RE.EDIT = TRUE THEN _                    'BK012301
  1549.         GOTO 2013                        'BK010501
  1550.  IF NOT QUOTED.REPLY THEN _              'Pe 09/10/89 moved line # up 3 lines
  1551.         LINES.IN.MESSAGE = 0 : _
  1552.         COMMPORT.STACK$ = "" : _
  1553.         L = 0 : _
  1554.         X = 0 : _
  1555.         REDIM A$(ADIM)
  1556. 2013   IF GET.EXT.DESC THEN _                                  'BK010501
  1557.         GOTO 2100
  1558.      GOSUB 1893
  1559.      RECEIVER.RECORD.NUM = 0
  1560. 2020 CALL MSGTO (HIGHEST.USER.RECORD,MESSAGE.TO$,RECEIVER.RECORD.NUM,FOUND)
  1561.      IF SYSOP.COMMENT THEN _
  1562.         GOTO 2100
  1563.      IF SYSOP.MESSAGE THEN _
  1564.         SYSOP.MESSAGE = FALSE : _
  1565.         MESSAGE.PASSWORD$ = "^READ^" : _
  1566.         GOTO 2100
  1567.      IF MESSAGE.TO$ = "" THEN _
  1568.         RETURN
  1569.      IF REPLY THEN _
  1570.         FOUND = TRUE : _
  1571.         CALL TRIM (MESSAGE.TO$):  _
  1572.         GOTO 2035 _
  1573.      ELSE SUBJECT$ = ""
  1574.      IF RE.EDIT = TRUE THEN _                    'BK012201
  1575.     SUBJECT$ = SUBJECT.OLD$                    'BK012201
  1576.      GOSUB 2065
  1577. 2035 CALL MSGPROT (MESSAGE.TO$,FOUND,MESSAGE.PASSWORD$)
  1578.      IF RE.EDIT = TRUE THEN _                    'BK012201
  1579.         RETURN                            'BK012201
  1580.      IF MESSAGE.PASSWORD$ = "" THEN _
  1581.         GOTO 2020
  1582.      IF QUOTED.REPLY THEN _
  1583.         RETURN
  1584.      GOTO 2100
  1585. '
  1586. ' *****  SET/CHANGE SUBJECT FOR A MESSAGE   ***
  1587. '
  1588. 2065 IF SUBJECT$ <> "" THEN _
  1589.         A$ = "Change SUBJECT from " + _
  1590.              SUBJECT$ + _
  1591.              " to" : _
  1592.         GOSUB 12932 _                                                ' KG081201
  1593.      ELSE A$ = "Subject" : _
  1594.           PARSE.OFF = TRUE : _                                       ' KG082602
  1595.           GOSUB 12932                                                ' KG081201
  1596.      IF LEN(B$) > 25 THEN _
  1597.         A$ = "25 Char. Max" : _
  1598.         GOSUB 12979 : _
  1599.         GOTO 2065
  1600.      IF Q = 0 THEN _
  1601.         IF SUBJECT$ <> "" THEN _
  1602.            RETURN _
  1603.         ELSE GOSUB 2435 : _
  1604.              IF YES THEN _
  1605.                 RETURN 5160 _
  1606.              ELSE GOTO 2065
  1607.      SUBJECT$ = B$
  1608.      CALL ALLCAPS (SUBJECT$)
  1609.      ORIG.SUBJECT$ = SUBJECT$
  1610.      RETURN
  1611. '
  1612. ' *****  ENTER MAIN BODY OF MESSAGE  ****
  1613. '
  1614. 2100 A$ =FG.1$+ "Type "+FG.2$ + _
  1615.           MSG.HEADER$ + _
  1616.        FG.3$+   STR$(MAX.MESSAGE.LINES) + _
  1617.           " lines max" + _
  1618.           PRESS.ENTER$ + EMPHASIZE.OFF$
  1619.      GOSUB 12975
  1620.      GOSUB 3200
  1621. 2125 LINES.IN.MESSAGE = LINES.IN.MESSAGE + 1
  1622. 2127 IF REMOTE.ECHO OR LOCAL.USER THEN _
  1623.         A$ = RIGHT$(STR$(LINES.IN.MESSAGE),2) + _
  1624.              ": " + _
  1625.              A$(LINES.IN.MESSAGE) _
  1626.      ELSE A$ = A$(LINES.IN.MESSAGE)
  1627.      GOSUB 12978
  1628.      CALL LINEEDIT(LINES.IN.MESSAGE,RIGHT.MARGIN + 1)
  1629.      IF WAIT.EXPIRED THEN _
  1630.         GOTO 10590 _
  1631.      ELSE IF SUBROUTINE.PARAMETER = -1 THEN _
  1632.              GOTO 10595
  1633.      CALL FINDFUNC
  1634.      IF SUBROUTINE.PARAMETER < 0 THEN _
  1635.         GOTO 202
  1636.      IF A$(LINES.IN.MESSAGE) = "" THEN _
  1637.         LINES.IN.MESSAGE = LINES.IN.MESSAGE - 1 : _
  1638.         GOTO 2300
  1639. 2140 J = LINES.IN.MESSAGE
  1640.      GOSUB 2200
  1641.      IF X THEN _
  1642.         GOTO 2300
  1643.      GOTO 2125
  1644. 2200 X = 0
  1645.      IF J < (MAX.MESSAGE.LINES - 2) THEN _
  1646.         RETURN
  1647.      A$ = MID$("2 lines leftLast line   Full",12 * (J-(MAX.MESSAGE.LINES - 2)) + 1,12)
  1648.      X = (J > (MAX.MESSAGE.LINES - 1))
  1649. 2210 GOSUB 12979
  1650.      RETURN
  1651. 2299 Z$ = "L"                            'BK010501
  1652.      L = 1                            'BK010501
  1653.      GOTO 2325                            'BK010501
  1654. '
  1655. ' *****  FINAL MESSAGE DISPOSITION   ****
  1656. '
  1657. 2300 CALL SKIPLINE (1)
  1658.      IF NOT EXPERT.USER THEN _
  1659.         CALL QTPUT1 ("A)bort," + LEFT$("B)tch Import,",-13 * (SYSOP OR LOCAL.USER)) + "C)ont,D)el,E)dit,I)nsert,L)ist,M)argin,R)ev subj,S)ave,P)hoto")
  1660. 2315 A$ = "Edit Sub-function <A," + _
  1661.           LEFT$("B,",-2 * (SYSOP OR LOCAL.USER)) + _
  1662.           "C,D,E,I,L,M,R,S,?,Photo>"                   'Pe Carbon
  1663.      CALL SKIPLINE (1)
  1664.      GOSUB 12999
  1665.      IF Q = 0 THEN _
  1666.         GOTO 2315
  1667.      CALL ALLCAPS (B$(1))
  1668.      Z$ = B$(1)
  1669.      CARBON$ = Z$               'Pe Carbon mod
  1670. 2325 IF Q < 2 THEN _
  1671.         GOTO 2330
  1672.      CALL CHECKINT (B$(2))
  1673.      IF EC <> 0 THEN _
  1674.         GOTO 2300 _
  1675.      ELSE L = TESTED.INTEGER.VALUE : _
  1676.           GOSUB 3320
  1677.      IF Q > 2 THEN _
  1678.         CALL CHECKINT (B$(3)) : _
  1679.         IF EC <> 0 THEN _
  1680.            GOTO 2300 _
  1681.         ELSE MARK2 = TESTED.INTEGER.VALUE
  1682. 2330 ON INSTR("ABCDEILMRS?P",Z$) GOTO 2400,2335,2332,2500,2600,2800,3000,3100,2440,3400,2345,3400 'Pe Carbon
  1683.      GOTO 2300
  1684. 2332 IF LINES.IN.MESSAGE < 1 THEN _
  1685.         LINES.IN.MESSAGE = 1
  1686.      GOTO 2127
  1687. 2335 X = LINES.IN.MESSAGE
  1688.      CALL MIMPORT (MAX.MESSAGE.LINES,RIGHT.MARGIN,LINES.IN.MESSAGE,A$())
  1689.      IF LINES.IN.MESSAGE > X THEN _
  1690.         GOTO 3000 _
  1691.      ELSE GOTO 2300
  1692. '
  1693. ' *****  DISPLAY MESSAGE SUBCOMMANDS HELP FILE   ****
  1694. '
  1695. 2345 FILE.NAME$ = HELP$(4)
  1696.      GOSUB 1790
  1697.      GOTO 2315
  1698. 2350 CALL FINDIT (MAIN.PUI$)
  1699.      CUSTOM.PUI = OK
  1700.      IF OK THEN _
  1701.         CURRENT.PUI$ = MAIN.PUI$ _
  1702.      ELSE CURRENT.PUI$ = ""
  1703.      RETURN
  1704. '
  1705. ' ****  ABORT MESSAGE   ***
  1706. '
  1707. 2400 GOSUB 2435
  1708.      IF NOT YES THEN _
  1709.         GOTO 2300
  1710. 2430 A$ = "Aborted"
  1711.      GOSUB 12975
  1712.      Z.ABORT = 1    'Pe 01/29/89
  1713.      RE.EDIT = FALSE                 'PE 09/10/89
  1714.      GOTO 3650
  1715. 2435 A$ = "Abort " + _
  1716.           MSG.HEADER$ + _                                            ' KG072003
  1717.           " (Y/[N])"
  1718.      GOSUB 12995
  1719.      RETURN
  1720. '
  1721. ' *****  CHANGE SUBJECT OF A MESSAGE  ****
  1722. '
  1723. 2440 GOSUB 2065
  1724.      GOTO 2300
  1725. '
  1726. ' *****  (BLOCK) DELETE MESSAGE LINE(S)  *****
  1727. '
  1728. 2500 CALL SKIPLINE (1)
  1729.      IF Q = 1 THEN _
  1730.         A$ = "Delete from " : _
  1731.         GOSUB 12978 : _
  1732.         GOSUB 3300
  1733.      MARK1 = L
  1734. 2520 IF Q < 3 THEN _
  1735.         A$ = "Up to and including " : _
  1736.         GOSUB 12978 : _
  1737.         GOSUB 3300 : _
  1738.         IF MARK2 = 0 THEN _
  1739.            MARK2 = L
  1740.      CALL SKIPLINE(1)
  1741.      IF MARK2 > LINES.IN.MESSAGE THEN _                              ' KG052001
  1742.         Q = 0 : _                                                    ' KG052001
  1743.         GOTO 2520                                                    ' KG052001
  1744.      IF MARK1 > MARK2 THEN _
  1745.         A$ = "BEGINNING exceeds END.  Block NOT deleted!" : _
  1746.         GOSUB 12979 : _
  1747.         GOTO 2555
  1748. 2522 FOR X = MARK1 TO MARK2
  1749.         CALL ASKMORE ("",TRUE,TRUE,XX,FALSE)
  1750.         IF NO OR RET THEN _
  1751.            X = MARK2 + 1 _
  1752.         ELSE A$ = A$(X) : _
  1753.            GOSUB 12977
  1754.      NEXT
  1755.      CALL SKIPLINE(1)
  1756. 2530 A$ = "Delete lines " + STR$(MARK1) + "-" + MID$(STR$(MARK2),2) + " (Y/[N])"
  1757.      GOSUB 12999
  1758.      IF NOT YES THEN _
  1759.         A$ = "NOT Deleted" : _
  1760.         GOSUB 12979 : _
  1761.         GOTO 2555
  1762. 2550 BLOCK.SIZE = (MARK2 - MARK1) + 1
  1763.      END.OF.BUFFER = LINES.IN.MESSAGE + 1
  1764.      LINES.IN.MESSAGE = LINES.IN.MESSAGE - BLOCK.SIZE
  1765.      FOR X = MARK1 TO LINES.IN.MESSAGE
  1766.         A$(X) = A$(X + BLOCK.SIZE)
  1767.      NEXT
  1768.      FOR X = (LINES.IN.MESSAGE + 1) TO (END.OF.BUFFER)
  1769.         A$(X) = ""
  1770.      NEXT
  1771.      A$ = "Deleted" + STR$(BLOCK.SIZE) + " line(s)"
  1772.      GOSUB 12979
  1773. 2555 MARK1 = 0
  1774.      MARK2 = 0
  1775.      GOTO 2300
  1776. '
  1777. ' ****  EDIT MESSAGE LINE  ***
  1778. '
  1779. 2600 CALL SKIPLINE (1)
  1780.      IF Q = 1 THEN _
  1781.         GOSUB 3300
  1782.      CALL EDITALINE (L)
  1783.      IF SUBROUTINE.PARAMETER < 0 THEN _
  1784.         GOTO 202
  1785.      GOTO 2300
  1786. 2800 IF LINES.IN.MESSAGE >= MAX.MESSAGE.LINES AND NOT SYSOP THEN _
  1787.         A$ = "Message full" : _
  1788.         GOSUB 12979 : _
  1789.         GOTO 2920
  1790. 2820 CALL SKIPLINE (1)
  1791.      IF Q = 1 THEN _
  1792.         A$ = "Before " : _
  1793.         GOSUB 12978 : _
  1794.         GOSUB 3300
  1795. 2830 LL = LINES.IN.MESSAGE
  1796.      K = LINES.IN.MESSAGE - L
  1797.      FOR X = L TO LINES.IN.MESSAGE
  1798.         B$(X + 1 - L) = A$(X)
  1799.         A$(X) = ""
  1800.      NEXT
  1801.      LINES.IN.MESSAGE = L
  1802. 2840 A$ = RIGHT$(STR$(LINES.IN.MESSAGE),2) + _
  1803.           ": "
  1804.      GOSUB 12978
  1805.      CALL LINEEDIT(LINES.IN.MESSAGE,RIGHT.MARGIN + 1)
  1806.      IF A$(LINES.IN.MESSAGE) = "" THEN _
  1807.         GOTO 2920
  1808. 2870 LINES.IN.MESSAGE = LINES.IN.MESSAGE + 1
  1809.      J = LINES.IN.MESSAGE + K - 1
  1810.      GOSUB 2200
  1811.      IF NOT X THEN _
  1812.         GOTO 2840
  1813. 2920 FOR X = 1 TO K + 1
  1814.         A$(LINES.IN.MESSAGE + X - 1) = B$(X)
  1815.      NEXT
  1816.      REDIM B$(ADIM)
  1817.      LINES.IN.MESSAGE = LL + LINES.IN.MESSAGE - L
  1818.      GOTO 2300
  1819. '
  1820. ' *****  LIST MESSAGE CONTENTS   ****
  1821. '
  1822. 3000 STOP.INTERRUPTS = FALSE
  1823.      CALL SKIPLINE (1)
  1824.      IF Q = 1 THEN _
  1825.         L = 1 : _
  1826.         A$ = FG.3$ + "To: " + _
  1827.              MESSAGE.TO$ + _
  1828.              FG.4$ + " Re: " + _
  1829.              SUBJECT$ + EMPHASIZE.OFF$ : _
  1830.         GOSUB 12979 : _
  1831.         CALL QTPUT (MID$("    ",1,-4 * (NOT REMOTE.ECHO)),0) : _
  1832.         GOSUB 3200
  1833. 3020 FOR X = L TO LINES.IN.MESSAGE
  1834.         CALL ASKMORE ("",TRUE,TRUE,XX,FALSE)
  1835.         IF NO OR RET THEN _
  1836.            X = LINES.IN.MESSAGE + 1 _
  1837.         ELSE A$ = RIGHT$(STR$(X),2) + _
  1838.                   ": " + _
  1839.                   A$(X) : _
  1840.              GOSUB 12979
  1841.      NEXT
  1842.      GOTO 2300
  1843. '
  1844. ' *****  CHANGE MARGIN WIDTH   ****
  1845. '
  1846. 3100 CALL SKIPLINE (1)
  1847.      A$ = "SET Right-Margin from" + _                                ' KG081201
  1848.           STR$(RIGHT.MARGIN) + _
  1849.           " TO (8...72)"
  1850.      GOSUB 12932                                                     ' KG081201
  1851.      IF LEN(B$(ANS.INDEX)) > 2 THEN _                                ' KG081201
  1852.         GOTO 3140
  1853. 3130 X = VAL(B$(ANS.INDEX))                                          ' KG081201
  1854.      IF X > 7 AND X < 73 THEN _
  1855.         RIGHT.MARGIN = X : _
  1856.         A$ = "Margin now" + _
  1857.              STR$(RIGHT.MARGIN) : _
  1858.         GOTO 3150
  1859. 3140 A$ = "Invalid - Margin UNCHANGED"
  1860. 3150 GOSUB 12979
  1861.      IF UTILITY.MARGIN.CHANGE THEN _
  1862.         RETURN
  1863.      GOTO 2300
  1864. 3200 A$ = "[" + _
  1865.           STRING$(RIGHT.MARGIN - 2,45) + _
  1866.           "]"
  1867.      IF REMOTE.ECHO OR LOCAL.USER THEN _
  1868.         A$ = "    " + _
  1869.              A$
  1870.      GOSUB 12975
  1871.      RETURN
  1872. 3300 A$ = "Line #"
  1873.      IF MARK1 <> 0 THEN _
  1874.         A$ = "Line # (ENTER =" + STR$(MARK1) + ")"
  1875.      GOSUB 12995
  1876.      CALL CHECKINT (B$(1))
  1877.      IF EC > 0 THEN _
  1878.         GOTO 3340
  1879.      L = TESTED.INTEGER.VALUE
  1880. 3320 IF L >= 1 AND L <= LINES.IN.MESSAGE THEN _
  1881.         RETURN
  1882. 3330 IF Q = 0 THEN _
  1883.         IF MARK1 = 0 THEN _
  1884.            RETURN 2300 _
  1885.         ELSE MARK2 = MARK1 : _
  1886.              RETURN
  1887. 3340 A$ = "No such line"
  1888.      GOSUB 12979
  1889.      RETURN 2300
  1890. '
  1891. ' ****  SAVE MESSAGE   ***
  1892. '
  1893. 3400   IF RE.EDIT = TRUE THEN _                    'BK012201
  1894.     KILL.MESSAGE = TRUE : _                    'BK012201
  1895.     CALL PUTMATTR : _                    'BK012201
  1896.     MESSAGE.TO.KILL = CURRENT.MESSAGE : _            'BK012201
  1897.     TEMP = 1 : _                        'BK012201
  1898.     GOSUB 3950 : _                        'BK012201
  1899.     CALL GETMATTR : _                    'BK012201
  1900.     KILL.MESSAGE = FALSE
  1901.      IF GET.EXT.DESC THEN _
  1902.         SYSOP.COMMENT = FALSE : _
  1903.         RETURN
  1904.      IF SYSOP.COMMENT THEN _
  1905.         SYSOP.COMMENT = FALSE : _
  1906.         GOTO 1850
  1907. 3405 GOSUB 4910
  1908.      MESSAGE.RECORD.SAVE$ = MESSAGE.RECORD$
  1909.      MSG.CORRECTED = FALSE
  1910.      GOSUB 23100
  1911.      A$ = "Adding new msg #" + _
  1912.           STR$(HIGH.MESSAGE.NUMBER + 1)
  1913.      IF NOT LOCAL.USER THEN _
  1914.         CALL UPDTCALR (A$,1)
  1915.      GOSUB 12978
  1916.      SL = 0
  1917.      N$ = ""
  1918.      IF LOW.MESSAGE.NUMBER = 0 THEN _
  1919.         LOW.MESSAGE.NUMBER = 1 : _
  1920.         HIGH.MESSAGE.NUMBER = 1 _
  1921.      ELSE HIGH.MESSAGE.NUMBER = HIGH.MESSAGE.NUMBER + 1
  1922. 3410 ACTIVE.MESSAGES = ACTIVE.MESSAGES + 1
  1923.      MESSAGE.NUMBER$ = STR$(HIGH.MESSAGE.NUMBER) + _
  1924.                        SPACE$(5 - LEN(STR$(HIGH.MESSAGE.NUMBER)))
  1925.      IF MESSAGE.PASSWORD$ = "^READ^" THEN _
  1926.         MID$(MESSAGE.NUMBER$,1,1) = "*" : _
  1927.         SSS = PRIVATE.READ.SEC _
  1928.      ELSE SSS = PUBLIC.READ.SEC
  1929. 3460 MESSAGE.FROM$ = LEFT$(ACTIVE.USER.NAME$ + SPACE$(31),31)
  1930.      IF RE.EDIT = TRUE THEN _                    'BK012201
  1931.     MESSAGE.FROM$ = LEFT$(MESSAGE.FROM.OLD$ + SPACE$(31),31)'BK012201
  1932.      RE.EDIT = FALSE                        'BK012201
  1933.      MESSAGE.TO$ = LEFT$(MESSAGE.TO$ + SPACE$(31),31)
  1934.      MID$(MESSAGE.TO$,23,8) = TIME$
  1935.      SUBJECT$ = LEFT$(ORIG.SUBJECT$ + SPACE$(25),25)
  1936.      MESSAGE.PASSWORD$ = LEFT$(MESSAGE.PASSWORD$ + SPACE$(15),15)
  1937.      IF QUOTED.REPLY AND _
  1938.         LINES.IN.MESSAGE > MAX.MESSAGE.LINES THEN _
  1939.            LINES.IN.MESSAGE = MAX.MESSAGE.LINES
  1940.      FOR J = 1 TO LINES.IN.MESSAGE
  1941.         SAV$(J) = A$(J)                  'Carbon Copy Mod
  1942.         A$(J) = A$(J) + _
  1943.                 CHR$(227)
  1944.         SL = SL + LEN(A$(J))
  1945.      NEXT
  1946.      IF SL MOD 128 = 0 THEN _
  1947.         N$ = STR$(SL \ 128 + 1) _
  1948.      ELSE N$ = STR$(SL \ 128 + 2)
  1949. 3530 TEMP = NEXT.MESSAGE.RECORD
  1950.      NEXT.MESSAGE.RECORD = TEMP + VAL(N$)
  1951.      LSET MESSAGE.RECORD$ = MESSAGE.RECORD.SAVE$
  1952.      GOSUB 24000
  1953.      GET 1,TEMP
  1954.      M(ACTIVE.MESSAGES,1) = TEMP
  1955.      M(ACTIVE.MESSAGES,2) = HIGH.MESSAGE.NUMBER
  1956.      LSET MESSAGE.RECORD$ = MESSAGE.NUMBER$ + _
  1957.                             MESSAGE.FROM$ + _
  1958.                             MESSAGE.TO$ + _
  1959.                             CURRENT.DATE$ + _
  1960.                             SUBJECT$ + _
  1961.                             MESSAGE.PASSWORD$ + _
  1962.                             ACTIVE.MESSAGE$ + _
  1963.                             N$ + _
  1964.                             SPACE$(4 - LEN(N$)) + _
  1965.                             MKI$(SSS)
  1966.      PUT 1,TEMP
  1967.      N$ = ""
  1968.      NUM.DOTS = 0
  1969.      FOR J = 1 TO LINES.IN.MESSAGE
  1970.         CALL MARKTIME (NUM.DOTS)
  1971.         N$ = N$ + _
  1972.              A$(J)
  1973.         IF LEN(N$) > 127 THEN _
  1974.            LSET MESSAGE.RECORD$ = N$ : _
  1975.            PUT 1 : _
  1976.            N$ = MID$(N$,129)
  1977. 3630 NEXT
  1978.      IF LEN(N$) > 0 THEN _
  1979.         LSET MESSAGE.RECORD$ = N$ : _
  1980.         PUT 1
  1981.      REDIM A$(ADIM)
  1982.      IF MSG.CORRECTED THEN _
  1983.         MSG.CORRECTED = FALSE : _
  1984.         ACTION.FLAG = TRUE : _
  1985.         CALL SKIPLINE (1) : _
  1986.         GOSUB 1900
  1987. 3640 CALL SKIPLINE (1)
  1988.      LSET MESSAGE.RECORD$ = MESSAGE.RECORD.SAVE$     'Pe 09/10/89
  1989.      GOSUB 24000                                     'Pe 09/10/89
  1990. '***   Main Carbon Copy Ability          < Add this Through Next '*** Line
  1991. 3645 IF CARBON$ = "P" THEN _                                     'PE CARBON MOD
  1992.      A$ = CRLF$ + "Send a Carbon Copy to Another User Y/[N]" :_
  1993.      CALL TGET : _
  1994.      IF NOT YES THEN_
  1995.      CARBON$ = "" : _
  1996.       GOTO 3647_
  1997.     ELSE _
  1998.      MESSAGE.TO$ = "" :_
  1999.      CALL MSGTO (HIGHEST.USER.RECORD,MESSAGE.TO$,RECEIVER.RECORD.NUM,FOUND) : _
  2000.      CALL TRIM (MESSAGE.TO$):  _
  2001.      CALL MSGPROT (MESSAGE.TO$,FOUND,MESSAGE.PASSWORD$): _
  2002.      NEXT.MESSAGE.RECORD = NEXT.RECORD.NUMBER + LINES.IN.MESSAGE + 1 : _
  2003.      FOR J = 1 TO LINES.IN.MESSAGE: _
  2004.      A$(J) = SAV$(J):_
  2005.      NEXT J:_
  2006.      GOTO 3400
  2007. '***   End Carbon Copy
  2008. 3647     GOSUB 12985
  2009. ' ---[ notify receiver that has new mail waiting ]---
  2010.      IF RECEIVER.RECORD.NUM > 0 THEN _
  2011.         SUIX = USER.FILE.INDEX : _
  2012.         USER.RECORD.HOLD$ = USER.RECORD$ : _
  2013.         USER.FILE.INDEX = RECEIVER.RECORD.NUM : _
  2014.         GOSUB 12989 : _
  2015.         GET 5, RECEIVER.RECORD.NUM : _
  2016.         X = CVI(MID$(USER.RECORD$,57,2)) : _
  2017.         MID$(USER.RECORD$,57,2) = MKI$(X OR 512) : _
  2018.         PUT 5, RECEIVER.RECORD.NUM : _
  2019.         GOSUB 12991 : _
  2020.         USER.FILE.INDEX = SUIX : _
  2021.         LSET USER.RECORD$ = USER.RECORD.HOLD$ : _
  2022.         CALL QTPUT (FG.3$+"Receiver"+FG.1$+" will be notified of "+CX$(1)+"new"+EMPHASIZE.OFF$+" mail",1) : _
  2023.         RECEIVER.RECORD.NUM = 0
  2024. 3650 QUOTED.REPLY = FALSE
  2025.      IF JUST.BROWSING THEN _
  2026.         ADD.TO.CONF = TRUE : _
  2027.         CALL QTPUT1 ("Adding you to " + GRN$) : _
  2028.         JUST.BROWSING = FALSE : _
  2029.         Z$ = GRN.NAME$ : _
  2030.         GRN$ = Z$ : _
  2031.         GOSUB 5328
  2032. '************************ MESSAGE THREAD *****************
  2033.  IF REPLY AND Z.ABORT = 0 THEN _         
  2034.   CALL THREAD1(HIGH.MESSAGE.NUMBER,CURRENT.MESSAGE,GRN$)
  2035.       Z.ABORT = 0
  2036. '*********************************************************
  2037.      IF REPLY THEN _
  2038.         REPLY = FALSE : _
  2039.         ANS.INDEX = SAVE.ANS.INDEX : _                               ' KG082901
  2040.         GOTO 5344
  2041.      IF GET.EXT.DESC THEN _
  2042.         LINES.IN.MESSAGE = 0 : _
  2043.         RETURN
  2044. IF LOGOFF$ = "G" THEN 10562 ' Pe 02/04/89
  2045.      RETURN 1200
  2046. '
  2047. ' ****  K - COMMAND FROM MAIN MENU (KILL MESSAGE)  ***
  2048. '
  2049. 3900 KILL.MESSAGE = FALSE
  2050.      CALL SKIPLINE (1)                                               ' KG081201
  2051. 3930 A$ = "Msg #(s) to Kill" + PRESS.ENTER.EXPERT$
  2052.      GOSUB 12932                                                     ' KG081201
  2053.      IF Q = 0 THEN _
  2054.         RETURN
  2055.      GOSUB 1893                                                      ' KG081201
  2056. 3935 CALL CHECKINT (B$(ANS.INDEX))                                   ' KG081201
  2057.      IF EC <> 0 THEN _
  2058.         GOTO 3930
  2059.      MESSAGE.TO.KILL = TESTED.INTEGER.VALUE
  2060. 3950 GOSUB 5344
  2061.      CALL KILLMSG (MESSAGE.TO.KILL,ACTIVE.MESSAGES,GRN$)   'Pe 01/12/89
  2062. 4040 IF KILL.MESSAGE THEN _                                          ' KG081201
  2063.         RETURN
  2064.      GOTO 3930
  2065. '
  2066. ' ****  Sysop Available toggle
  2067. '
  2068. 4130  SUBROUTINE.PARAMETER = -8
  2069.       CALL FINDFUNC
  2070.       SUBROUTINE.PARAMETER = 0
  2071.       RETURN
  2072. '
  2073. ' ****  X)pert Toggle
  2074. '
  2075. 4240 CALL TOGGLE(9)
  2076.      RETURN
  2077. '  ****************************************************************************
  2078. '  *  Ask users who have NOT Read all new messages do they want to NOW!       *
  2079. '  *  Carrage Return Defaults to [Y]es                                        *
  2080. '  ****************************************************************************
  2081. 4275 A$ = "There are New Message since last call, Read them now ? ([Y]/N) ":_  
  2082.      GOSUB 12999                            'JABASKMAIL
  2083. 4279 IF NOT NO THEN _                            'JABASKMAIL
  2084.      Q = 2: _
  2085.      LAST.INDEX = 2: _
  2086.      B$(2) = "S" :_           'PE 09/07/89
  2087.      GOTO 4330 _                            'JABASKMAIL
  2088.      ELSE RETURN                            'JABASKMAIL
  2089. '
  2090. '
  2091. ' ****  T)opic - QUICK SCAN MESSAGES  ***
  2092. '
  2093. 4320 QUICK.SCAN.MESSAGES = TRUE
  2094.      READ.MESSAGES = FALSE
  2095.      SCAN.MESSAGES = FALSE
  2096.      MSG.START = 76
  2097.      MSG.END = 100
  2098.      SEC.INDEX= 0
  2099.      GOTO 4350
  2100. '
  2101. ' ****  R - COMMAND FROM MAIN MENU (READ MESSAGES)  ****
  2102. '
  2103. 4330 QUICK.SCAN.MESSAGES = FALSE
  2104.      READ.MESSAGES = TRUE
  2105.      HIGHLITE.REC = -1
  2106.      SCAN.MESSAGES = FALSE
  2107.      MSG.START = 6
  2108.      MSG.END = 100
  2109.      IF LOCAL.USER.MODE OR NOT LOCAL.USER THEN _
  2110.         IF READ.MSG.IN$ <> ACTIVE.MESSAGE.FILE$ THEN _
  2111.            READ.MSG.IN$ = ACTIVE.MESSAGE.FILE$ : _
  2112.            CALL UPDTCALR ("Read Messages in " + READ.MSG.IN$,1)
  2113.      GOSUB 1300
  2114.      GOTO 4350
  2115. '
  2116. ' ****  S - COMMAND FROM MAIN MENU (SCAN MESSAGE HEADERS)  ***
  2117. '
  2118. 4340 IF Q < 2 THEN _
  2119.         GOSUB 1300
  2120. 4345 QUICK.SCAN.MESSAGES = FALSE
  2121.      READ.MESSAGES = FALSE
  2122.      SCAN.MESSAGES = TRUE
  2123.      MSG.START = 6
  2124.      MSG.END = 100
  2125.      SEC.INDEX = 0
  2126. '
  2127. ' ** MESSAGE READ MAINLINE (QUICK SCAN, READ & SCAN) ALL USE THIS ROUTINE *
  2128. '
  2129. 4350 SEARCH.HEADER$ = ""
  2130.      SELECT.BY.NUMBER = FALSE
  2131. 4352 SEARCH.STRING$ = ""
  2132.      DONT.PRINT = FALSE
  2133.      JUST.REPLIED = FALSE
  2134.      QUOTED.REPLY = FALSE
  2135.      RE.EDIT = FALSE                        'BK012201
  2136.      CAN.KILL = (SYSOP OR USER.SECURITY.LEVEL >= SEC.KILL.ANY)
  2137.      GOSUB 1893
  2138.      GOSUB 5344
  2139.      Z$ = ""
  2140.      FOR I = 2 TO Q
  2141.         IF INSTR("Ss*",B$(I)) > 0 THEN _
  2142.            B$(I) = MID$(STR$(LAST.MESSAGE.READ+1),2) + "+"
  2143.         IF INSTR("Ll",B$(I)) > 0 THEN _                              ' KG112601
  2144.            B$(I) = MID$(STR$(HIGH.MESSAGE.NUMBER),2) + "-"    'PE 12/10/88
  2145.         IF LEN(B$(I)) = 1 THEN _                                     ' KG102704
  2146.            IF INSTR("Cc",B$(I)) > 0 THEN _                           ' KG102704
  2147.               NON.STOP = TRUE                                        ' KG102704
  2148.      NEXT
  2149. 4360 LG$(11) = Z$                                                    ' KG081201
  2150.      NUMBER.MESSAGES.SELECTED = LAST.INDEX                           ' KG081201
  2151.      ADDRESSED.TO.USER = FALSE
  2152.      TO.REQUESTED = FALSE
  2153.      FROM.REQUESTED = FALSE
  2154.      IF PAGE.LENGTH < 1 THEN _
  2155.         NON.STOP = TRUE
  2156. 4370 ANS.INDEX = ANS.INDEX  + 1                                      ' KG081201
  2157. 4371 IF ANS.INDEX <= NUMBER.MESSAGES.SELECTED THEN _                 ' KG081201
  2158.         CALL CHECKINT (B$(ANS.INDEX)) : _                            ' KG081201
  2159.         IF EC <> 0 THEN _
  2160.            EL = 4371 : _
  2161.            GOTO 13000 _
  2162.         ELSE CURRENT.MESSAGE = TESTED.INTEGER.VALUE : _
  2163.              GOTO 4415
  2164. 4380 NON.STOP = (PAGE.LENGTH < 1)
  2165.      A$ = ""
  2166.        A1$ = ""                                                 'Tkey *
  2167. A1$ =  "A)ll, N)umber, S)ince," 
  2168. A1$ = A1$+ " T)ext, M)ine, L)ast, H)elp or"
  2169.      TURBO.KEY = -TURBO.KEY.USER
  2170.      IF ADDRESSED.TO.USER OR TO.REQUESTED OR FROM.REQUESTED THEN _
  2171.           CALL QTPUT(CX$(3) + "Selecting" + CX$(4) + _           'Tkey *
  2172.                      " Your" + CX$(3) + " messages....",1) : _   'Tkey *
  2173.           SELECT.BY.NUMBER = TRUE                                'Tkey *
  2174.        IF SEARCH.STRING$ <> "" THEN _
  2175.           CALL QTPUT(CX$(3) + "Selecting messages with '" + _    'Tkey *
  2176.                      CX$(4) + SEARCH.STRING$ + CX$(7) + _        'Tkey *
  2177.                     "'....",1) : _                               'Tkey *
  2178.     SELECT.BY.NUMBER = TRUE 
  2179.        IF SELECT.BY.NUMBER THEN _                                'Tkey *
  2180.           A1$ = "Enter message number(s)"  + _  'Tkey *
  2181.                 STR$(LOW.MESSAGE.NUMBER)  + _            'Tkey *
  2182.                 " to" + STR$(M(ACTIVE.MESSAGES,2)) + _  'Tkey *
  2183.            " A)ll " : _ 
  2184.       TURBO.KEY = FALSE
  2185. 4390 A$ = A1$ + PRESS.ENTER.EXPERT$
  2186.      MACRO.MIN = 99
  2187. 4400 GOSUB 12995
  2188.      IF Q = 0 THEN _
  2189.        GOSUB 4650 : _
  2190.         RETURN
  2191.      IF SELECT.BY.NUMBER THEN _                                   'Tkey *
  2192.         IF INSTR("Aa",LEFT$(B$(1),1)) THEN _                      'Tkey *
  2193.            B$(1) = "1+"                                           'Tkey *
  2194.      IF LEN(B$(1)) = 1 THEN                                       'Tkey *
  2195.         IF INSTR("Aa",LEFT$(B$(1),1)) THEN _                      'Tkey *
  2196.            B$(1) = "1+"                                           'Tkey *
  2197.      IF LEN(B$(1)) = 1 THEN _                                'Pe 12/10/88
  2198.          IF INSTR("Ll",LEFT$(B$(1),1)) THEN _                'Pe 12/10/88
  2199.            B$(1) = "9999-"                                   'Pe 12/10/88
  2200.       IF LEN(B$(1)) = 1 THEN _
  2201.         IF INSTR("Qq",LEFT$(B$(1),1)) THEN _
  2202.          GOSUB 4650 : _
  2203.            RETURN 
  2204.        IF INSTR("Hh",LEFT$(B$(1),1)) THEN _ 
  2205.                 FILE.NAME$ = HELP.PATH$ + "MR" + HELP.EXTENSION$ : _
  2206.                 GOSUB 1790 : _
  2207.         TURBO.KEY = -TURBO.KEY.USER : _
  2208.                 GOTO 4390
  2209.         IF INSTR("Nn",LEFT$(B$(1),1)) THEN _                       'Tkey *
  2210.            SELECT.BY.NUMBER = TRUE : _                             'Tkey *
  2211.            GOTO 4380                                               'Tkey *
  2212.         IF INSTR("Tt",LEFT$(B$(1),1)) THEN _                       'Tkey *
  2213.            A1$ =  "Enter text to search for " : _          'Tkey *
  2214.            GOTO 4390                                               'Tkey *
  2215.      END IF                                                        'Tkey *
  2216.      ANS.INDEX = 0
  2217.      NUMBER.MESSAGES.SELECTED = Q
  2218.      GOTO 4370
  2219. 4415 FORWARD = FALSE
  2220.      REVERSE = FALSE
  2221.      IF LEN(B$(ANS.INDEX)) = 1 THEN _                                ' KG081201
  2222.         IF INSTR("Ss*",B$(ANS.INDEX)) > 0 THEN _                     ' KG081201
  2223.            CURRENT.MESSAGE = LAST.MESSAGE.READ + 1 : _
  2224.            FORWARD = TRUE : _
  2225.            GOTO 4430 
  2226. IF LEN(B$(ANS.INDEX)) = 1 THEN _
  2227.  IF INSTR("Ll",B$(ANS.INDEX)) > 0 THEN _                 'Pe 12/10/89
  2228.                 CURRENT.MESSAGE = HIGH.MESSAGE.NUMBER : _
  2229.                 REVERSE = TRUE : _
  2230.                 GOTO 4490
  2231. 4416 IF INSTR("Mm",B$(ANS.INDEX)) THEN _                             ' KG081201
  2232.         ADDRESSED.TO.USER = TRUE : _
  2233.         GOTO 4370
  2234.      A = INSTR("FfTt",B$(ANS.INDEX))                                 ' KG081201
  2235.      IF A > 0 THEN _
  2236.         TO.REQUESTED = (A > 2) : _
  2237.         FROM.REQUESTED = (A < 3) : _
  2238.         GOTO 4370
  2239.      IF CURRENT.MESSAGE = 0 THEN _
  2240.         IF SEARCH.HEADER$ <> "" THEN _
  2241.            GOTO 4370 _
  2242.         ELSE SEARCH.STRING$ = B$(ANS.INDEX) : _                      ' KG081201
  2243.              CALL ALLCAPS (SEARCH.STRING$) : _
  2244.              CALL REMOVE (SEARCH.STRING$,CHR$(34) + CHR$(39)) : _
  2245.              SEARCH.HEADER$ = SEARCH.STRING$ : _
  2246.              GOTO 4370
  2247.      CALL SKIPLINE (1)
  2248. 4430 IF RIGHT$(B$(ANS.INDEX),1) = "+" THEN _                         ' KG081201
  2249.         FORWARD = TRUE
  2250.      IF RIGHT$(B$(ANS.INDEX),1) = "-" THEN _                         ' KG081201
  2251.         REVERSE = TRUE : _
  2252.         GOTO 4490
  2253. 4450 MESSAGE.DIM.INDEX = 1
  2254. 4452 IF MESSAGE.DIM.INDEX > ACTIVE.MESSAGES THEN _
  2255.         GOTO 4515
  2256.      IF READ.MESSAGES AND _
  2257.         M(MESSAGE.DIM.INDEX,2) = CURRENT.MESSAGE THEN _
  2258.         GOTO 4520
  2259. 4470 IF ((READ.MESSAGES AND FORWARD) OR _
  2260.         QUICK.SCAN.MESSAGES OR SCAN.MESSAGES) AND _
  2261.         M(MESSAGE.DIM.INDEX,2) >= CURRENT.MESSAGE THEN _
  2262.         GOTO 4520
  2263. 4480 MESSAGE.DIM.INDEX = MESSAGE.DIM.INDEX + 1
  2264.      GOTO 4452
  2265. 4490 MESSAGE.DIM.INDEX = ACTIVE.MESSAGES
  2266. 4492 IF MESSAGE.DIM.INDEX < 1 THEN _
  2267.         GOTO 4515
  2268.      IF M(MESSAGE.DIM.INDEX,2) <= CURRENT.MESSAGE THEN _
  2269.         GOTO 4540
  2270. 4510 MESSAGE.DIM.INDEX = MESSAGE.DIM.INDEX - 1
  2271.      GOTO 4492
  2272. 4515 IF FORWARD THEN _
  2273.         A$ = "No new messages" _
  2274.      ELSE A$ = "No such msg #" + _
  2275.                STR$(CURRENT.MESSAGE)
  2276.      GOSUB 12979
  2277.      GOTO 4370
  2278. 4520 ENDING.MESSAGE.INDEX = MESSAGE.DIM.INDEX
  2279.      IF READ.MESSAGES AND NOT FORWARD THEN _
  2280.         GOTO 4560
  2281. 4530 STARTING.MESSAGE.INDEX = MESSAGE.DIM.INDEX
  2282.      ENDING.MESSAGE.INDEX = ACTIVE.MESSAGES
  2283.      SO = 1
  2284.      GOTO 4550
  2285. 4540 STARTING.MESSAGE.INDEX = MESSAGE.DIM.INDEX
  2286.      ENDING.MESSAGE.INDEX = 1
  2287.      SO = -1
  2288. 4550 XXX = ENDING.MESSAGE.INDEX + SO
  2289.      MESSAGE.DIM.INDEX = STARTING.MESSAGE.INDEX
  2290. 4552 IF MESSAGE.DIM.INDEX = XXX THEN _
  2291.         CALL CARRIER : _                                             ' KG061203
  2292.         GOTO 4637
  2293. 4560   CURRENT.HEADER = M(MESSAGE.DIM.INDEX,1)
  2294.        IF CURRENT.HEADER < 1 THEN _
  2295.           GOTO 4515
  2296.        GET 1,CURRENT.HEADER
  2297.        PASSWORD.FAILED = 0
  2298.        UH = 0
  2299.        Z$ = MID$(MESSAGE.RECORD$,101,15)
  2300.        X = 1
  2301. 4561   X$ = MID$(MESSAGE.RECORD$,X)
  2302.        FF = INSTR(X$,MESSAGE.USER.NAME$)
  2303.       DGSFF = FALSE                                              'DGS-ALS
  2304.        IF FF = 0 THEN _                                           'DGS-ALS
  2305.       FF = INSTR(X$,LEFT$(ACTIVE.USER.NAME$,22)) : _          'DGS-ALS
  2306.       DGSFF = TRUE                                            'DGS-ALS
  2307.        IF FF > 0 THEN _
  2308.       IF DGSFF = TRUE THEN _                                  'DGS-ALS
  2309.          X = LEN (ACTIVE.USER.NAME$) _                        'DGS-ALS
  2310.       ELSE _                                                  'DGS-ALS
  2311.          X = LEN(MESSAGE.USER.NAME$) _                        'DGS-ALSMOD
  2312.        ELSE IF SYSOP THEN _
  2313.                FF = INSTR(X$,"SYSOP") : _
  2314.                X = 5 : _
  2315.                IF FF = 0 THEN _
  2316.                   X = LEN(SYSOP.FULL.NAME$) : _
  2317.                   FF = INSTR(X$,SYSOP.FULL.NAME$)
  2318.        IF FF > 0 THEN _
  2319.           X = X + FF : _
  2320.           IF (FF < 7 OR MID$(MESSAGE.RECORD$,FF - 1,1) = " ") AND (X > 58 OR MID$(MESSAGE.RECORD$,X,1) = " ") THEN _
  2321.              UH = TRUE _
  2322.           ELSE IF FF < 37 THEN _
  2323.                   X = 37 : _
  2324.                   GOTO 4561
  2325.        MSG.TO.CALLER = UH AND (FF = 37)
  2326.        MSG.FROM.CALLER = UH AND (FF = 6)
  2327.        GOSUB 4655                                                    ' KG060901
  2328. 4562   IF NOT CAN.KILL THEN _
  2329.           IF INSTR(MESSAGE.RECORD$,"^READ^") > 0 AND NOT UH THEN _
  2330.              PASSWORD.FAILED = TRUE : _
  2331.              IF FORWARD OR REVERSE THEN _
  2332.                 GOTO 4635
  2333. 4563   CURRENT.MESSAGE = VAL(MID$(MESSAGE.RECORD$,2,4))
  2334.        IF TO.REQUESTED THEN _
  2335.           IF NOT MSG.TO.CALLER THEN _
  2336.              GOTO 4625
  2337.        IF FROM.REQUESTED THEN _
  2338.           IF NOT MSG.FROM.CALLER THEN _
  2339.              GOTO 4625
  2340.        IF ADDRESSED.TO.USER AND NOT UH THEN _
  2341.           GOTO 4625
  2342.        X$ = MID$(MESSAGE.RECORD$,121,2)
  2343.        IF X$ = "  " THEN _
  2344.           MESSAGE.SECURITY = MINIMUM.LOGON.SECURITY _
  2345.        ELSE MESSAGE.SECURITY = CVI(X$)
  2346.        IF USER.SECURITY.LEVEL < MESSAGE.SECURITY THEN _
  2347.           GOTO 4625
  2348. 4580   IF INSTR(MESSAGE.RECORD$,LG$(11)) = 0 THEN _
  2349.           GOTO 4635
  2350. 4581   IF MID$(MESSAGE.RECORD$,116,1) = DELETED.MESSAGE$ THEN _
  2351.           GOTO 4630
  2352.        JUST.SEARCHING = FALSE
  2353.        IF SEARCH.HEADER$ <> "" THEN _
  2354.           FF = INSTR(MESSAGE.RECORD$,SEARCH.HEADER$) : _
  2355.           IF FF >= MSG.START AND FF <= MSG.END THEN _
  2356.              HIGHLITE.POS = FF : _
  2357.              GOTO 4582 _
  2358.           ELSE IF READ.MESSAGES AND SEARCH.STRING$ <> "" THEN _
  2359.                   JUST.SEARCHING = TRUE : _
  2360.                   GOTO 4582 _
  2361.                ELSE GOTO 4625
  2362. 4582   PG = FALSE
  2363.        IF MID$(Z$,1,1) = "!" THEN _
  2364.           IF NOT CAN.KILL THEN _
  2365.              PG = TRUE : _
  2366.              PASSWORD.SAVE$ = MID$(Z$,2) + _
  2367.                               " " : _
  2368.              ATTEMPTS.ALLOWED = 0 : _
  2369.              SUBROUTINE.PARAMETER = 1 : _
  2370.              CALL PASSWRD
  2371. 4584   IF PASSWORD.FAILED AND _
  2372.           (QUICK.SCAN.MESSAGES OR (SCAN.MESSAGES AND NOT PG)) THEN _
  2373.           GOTO 4635
  2374. 4585   IF PASSWORD.FAILED THEN _
  2375.           IF PG THEN _
  2376.              SJ$ = "<PASSWORD>" _
  2377.           ELSE SJ$ = "<PROTECTED>" _
  2378.        ELSE SJ$ = MID$(MESSAGE.RECORD$,76,25)
  2379. 4590   IF QUICK.SCAN.MESSAGES THEN _
  2380.           A$ = LEFT$(MESSAGE.RECORD$,5) + _
  2381.                " " + _
  2382.                LEFT$(SJ$,19) + _
  2383.                " " : _
  2384.           CALL CHKCOLOR (A$,SEARCH.HEADER$,EMPHASIZE.OFF$) : _
  2385.           GOSUB 12978 : _
  2386.           SEC.INDEX = SEC.INDEX + 1 : _
  2387.           IF SEC.INDEX = 3 THEN _
  2388.              SEC.INDEX = 0 : _
  2389.              CALL SKIPLINE (1) : _
  2390.              GOTO 4630  _
  2391.           ELSE GOTO 4630
  2392. 4600   IF SCAN.MESSAGES THEN _
  2393.           GOSUB 8020 : _
  2394.           GOTO 4630
  2395.        IF NOT JUST.SEARCHING THEN _
  2396.           GOSUB 8000 : _                   ' the :_ was not here in 17D ?
  2397.           IF QUOTED.REPLY = TRUE THEN _
  2398.              GOTO 4610
  2399.        IF RET THEN _
  2400.           GOTO 4630                                                  ' KG060901
  2401.        CAN.CHG.SEC = (USER.SECURITY.LEVEL => SEC.CHANGE.MSG)
  2402.        IF EXPERT.USER THEN _
  2403.           A1$ = ",R,T,=,+,-" + _
  2404.                 MID$(",K",1,- (UH OR CAN.KILL) * 2) + _
  2405.                 MID$(",S",1, - CAN.CHG.SEC * 2)  +_               'BK012302
  2406.                 MID$(",E",1, - (SYSOP OR MSG.FROM.CALLER) * 2) _'BK012302
  2407.        ELSE A1$ = ",R)eply,T)hread,=)reread,+,-" + _
  2408.                   MID$(",K)ill",1, - (UH OR CAN.KILL) * 7) + _
  2409.                   MID$(",S)ec chg",1, - CAN.CHG.SEC * 12) + _     'BK012201
  2410.                   MID$(",E)dit",1, - (SYSOP OR MSG.FROM.CALLER) * 7)'BK012302
  2411.        TURBO.KEY = -TURBO.KEY.USER
  2412.        IF JUST.SEARCHING OR NOT JUST.REPLIED THEN _
  2413.           GOTO 4610
  2414.        JUST.REPLIED = FALSE                                          ' KG060901
  2415.        CALL ASKMORE (A1$,TRUE,FALSE,ANS.INDEX,FALSE)                 ' KG081201
  2416.        CALL SKIPLINE (1)
  2417.        IF NO THEN _
  2418.           RETURN
  2419.        CALL ALLCAPS (B$)
  2420.        REPLY = (REPLY OR B$ = "R")
  2421.        IF B$ <> "=" THEN _
  2422.           GOTO 4618
  2423.        CALL SKIPLINE (1)
  2424. 4610   IF NOT PASSWORD.FAILED THEN _
  2425.           GOTO 4613
  2426.        IF PG AND (NOT NON.STOP) THEN _
  2427.           ATTEMPTS.ALLOWED = 2 : _
  2428.           SUBROUTINE.PARAMETER = 2 : _
  2429.           CALL PASSWRD
  2430. 4611   IF PASSWORD.FAILED THEN _
  2431.           GOTO 4625
  2432. 4613 CALL THREAD3(CURRENT.MESSAGE,GRN$)
  2433.        GOSUB 9000
  2434.        DONT.PRINT = FALSE
  2435.        IF JUST.SEARCHING THEN _
  2436.           GOTO 4625
  2437.        IF ANS.INDEX > NUMBER.MESSAGES.SELECTED THEN _                ' KG081201
  2438.           GOTO 4650
  2439.        CALL SKIPLINE (1)
  2440. 4614   GOSUB 41000
  2441.        KILL.MESSAGE = FALSE
  2442.        REPLY = FALSE
  2443.        IF NON.STOP THEN _
  2444.           GOTO 4625
  2445. 4616   TURBO.KEY = -TURBO.KEY.USER
  2446.        CALL ASKMORE (A1$,TRUE,FALSE,XX,FALSE)
  2447.        IF NO THEN _
  2448.           ANS.INDEX = LAST.INDEX + 1 : _                             ' KG082505
  2449.           RETURN
  2450.        CALL ALLCAPS(B$(1))
  2451.        REPLY = (REPLY OR B$(1) ="R")
  2452.        IF B$(1) = "=" THEN _
  2453.           CALL SKIPLINE (1) : _
  2454.           GOTO 4560
  2455. '
  2456. ' ****  CHECK FOR CHANGE SECURITY  ***
  2457. '
  2458. 4618  IF B$(1) = "S" AND CAN.CHG.SEC THEN _
  2459.          GOSUB 4665
  2460.       IF B$(1) = "T" THEN _
  2461.          CALL SETTHREAD (CURRENT.MESSAGE, ORIG.SUBJECT$) : _
  2462.          IF Q > 0 THEN _
  2463.             SEARCH.HEADER$ = B$(2) : _
  2464.             CALL REMOVE (SEARCH.HEADER$,CHR$(34)+CHR$(39)) : _
  2465.             GOTO 4352
  2466.       A = INSTR(" +-",B$(1))
  2467.       IF A > 1 THEN _
  2468.          CURRENT.MESSAGE = CURRENT.MESSAGE + 5 - 2 * A : _
  2469.          FORWARD = (A = 2) : _
  2470.          REVERSE = (NOT FORWARD) : _
  2471.          SEARCH.STRING$ = "" : _
  2472.          IF REVERSE THEN _
  2473.             GOTO 4490 _
  2474.          ELSE GOTO 4450
  2475. '
  2476. ' ****  KILL CURRENT MESSAGE  ***
  2477. '
  2478.       IF KILL.MESSAGE AND (UH OR CAN.KILL) THEN _
  2479.          IF USER.SECURITY.LEVEL >= OPT.SEC(9) THEN _
  2480.             CALL PUTMATTR : _
  2481.             MESSAGE.TO.KILL = CURRENT.MESSAGE : _
  2482.             TEMP = Q : _
  2483.             GOSUB 3950 : _
  2484.             CALL GETMATTR : _
  2485.             GOTO 4625 _
  2486.          ELSE VIOLATION$ = "MORE KILL" : _
  2487.               GOSUB 1380 : _
  2488.               GOTO 4625
  2489. 4619   IF (SYSOP OR MSG.FROM.CALLER) AND _            'BK012302
  2490.          (B$(1) = "E") THEN _                    'BK012201
  2491.          GOSUB 4670                        'BK012201
  2492. '
  2493. ' ****  REPLY TO CURRENT MESSAGE  ***
  2494. '
  2495. 4620   IF NOT REPLY THEN _
  2496.           GOTO 4625
  2497. 4621   IF USER.SECURITY.LEVEL < OPT.SEC(5) THEN _
  2498.           VIOLATION$ = "MORE RE" : _
  2499.           GOSUB 1380 : _
  2500.           REPLY = FALSE : _
  2501.           GOTO 4625
  2502.        IF LEFT$(SUBJECT$,3) <> "(R)" THEN _
  2503.           ORIG.SUBJECT$ = "(R)" + _                                  ' KG060102
  2504.                      LEFT$(ORIG.SUBJECT$,22)
  2505. 4622   MESSAGE.TO$ = MESSAGE.FROM$
  2506.        CALL TRIM (MESSAGE.TO$)
  2507.        MESSAGE.FROM$ = ACTIVE.USER.NAME$
  2508.        DONT.PRINT = FALSE
  2509.        CALL PUTMATTR
  2510.        A$ = "Quote " + MESSAGE.TO$ + "'s message (Y/[N])"
  2511.        GOSUB 12999
  2512.        IF RET OR NOT YES THEN _
  2513.           GOTO 4623
  2514.        QUOTED.REPLY = TRUE
  2515.        LINES.IN.MESSAGE = LINES.IN.MESSAGE - 1                       ' KG061202
  2516.        CALL WORDWRAP (RIGHT.MARGIN-2,LINES.IN.MESSAGE,A$())
  2517.        IF LINES.IN.MESSAGE > ADIM THEN _
  2518.           LINES.IN.MESSAGE = ADIM : _
  2519.           CALL QTPUT1 ("Quote truncated to " + _
  2520.                       STR$(ADIM) + " lines for editing!")
  2521.        FOR X = 1 TO LINES.IN.MESSAGE
  2522.           IF LEFT$(A$(X),1) = ">" THEN _                             ' KG061202
  2523.              A$(X) = ">" + A$(X) _                                   ' KG061202
  2524.           ELSE A$(X) = "> " + A$(X)                                  ' KG061202
  2525.        NEXT
  2526.        GOSUB 2001
  2527.        IF ACTIVE.MESSAGES >= MAXIMUM.MESSAGES THEN _
  2528.           GOTO 4624
  2529.        Z$ = "L"
  2530.        L = 1
  2531.        IF LINES.IN.MESSAGE >= MAX.MESSAGE.LINES THEN _
  2532.           CALL QTPUT ("Msg cannot exceed" + _
  2533.                       STR$(MAX.MESSAGE.LINES) + " lines! ",0)
  2534.        CALL QTPUT1 ("Please delete unneeded lines (eg. d 1 5)")
  2535.  CALL QTPUT1 ("Use the " +FG.1$ + "C" + FG.2$ + ")"+ FG.1$ +"ontinue command to Add more lines to message "+ EMPAHSIZE.OFF$)
  2536.        GOSUB 2325
  2537.        GOTO 4624
  2538. 4623   GOSUB 2000
  2539. 4624   REPLY = FALSE
  2540.        JUST.REPLIED = TRUE
  2541.        QUOTED.REPLY = TRUE
  2542.        CALL GETMATTR
  2543.        DONT.PRINT = TRUE
  2544.        B$ = "="
  2545.        QUOTED.REPLY = TRUE
  2546.        GOTO 4560
  2547. 4625   QUOTED.REPLY = FALSE
  2548.        JUST.REPLIED = FALSE
  2549.        IF NOT FORWARD AND NOT REVERSE THEN _
  2550.           GOTO 4370
  2551. 4630   CALL ASKMORE (",#(s) to read",TRUE,TRUE,XX,FALSE)
  2552.        IF Q = 0 OR YES THEN _                                        ' KG072701
  2553.           GOTO 4631
  2554.        IF NO THEN _
  2555.           RETURN
  2556.        IF SUBROUTINE.PARAMETER = -1 THEN _
  2557.           RETURN 10595
  2558.        IF RET THEN _
  2559.           RETURN
  2560.        Z$ = B$(1)
  2561.        CALL ALLCAPS (Z$)
  2562.        IF VAL(Z$) > 0 THEN _
  2563.           FOR I = Q TO 1 STEP -1 : _
  2564.              B$(I + 1) = B$(I) : _
  2565.           NEXT : _
  2566.           B$(1) = MID$(ALL.OPTS$,INSTR(ORIG.COMMANDS$,"R"),1)        ' EC062401
  2567.           LAST.INDEX = Q + 1 : _                                     ' KG081201
  2568.           ANS.INDEX = 1 : _                                          ' KG081201
  2569.           RETURN 1235
  2570. 4631   CALL CHKCARRIER                                               ' KG061203
  2571.        IF SUBROUTINE.PARAMETER THEN _
  2572.           RETURN 10595
  2573.        IF RET THEN _
  2574.           RETURN
  2575. 4635 IF SO = 0 THEN _
  2576.         SO = 1
  2577.      MESSAGE.DIM.INDEX = MESSAGE.DIM.INDEX + SO
  2578.      GOTO 4552
  2579. 4637 IF READ.MESSAGES THEN _
  2580.         SEARCH.STRING$ = "" : _
  2581.         SEARCH.HEADER$ = "" : _
  2582.         TO.REQUESTED = FALSE : _
  2583.         FROM.REQUESTED = FALSE : _
  2584.         ADDRESSED.TO.USER = FALSE : _
  2585.         GOTO 4370
  2586. 4650 CALL SKIPLINE (1) 'GOSUB 12979
  2587.      CALL QTPUT1 ("<------- End of Selected Messages -------->")
  2588.      CALL DELAYIT (1)
  2589.      RETURN
  2590. 4655 IF SEARCH.STRING$ <> "" OR NOT READ.MESSAGES THEN _   ' update last message read ' KG060901
  2591.         RETURN                                                       ' KG060901
  2592. 4656 IF M(MESSAGE.DIM.INDEX,2) > LAST.MESSAGE.READ THEN _            ' KG060901
  2593.         MAIL.WAITING = FALSE : _                                     ' KG060901
  2594.         LAST.MESSAGE.READ = M(MESSAGE.DIM.INDEX,2)                   ' KG060901
  2595.      RETURN                                                          ' KG060901
  2596. '
  2597. ' ****    - CHANGE MESSAGE READ SECURITY   ***
  2598. '
  2599. 4665 IF Q > 1 THEN _
  2600.         B$ = B$(2) : _
  2601.         GOTO 4666
  2602.      A$ = "Change min sec to read from" + _
  2603.           STR$(MESSAGE.SECURITY) + _
  2604.           " to"
  2605.      GOSUB 12995
  2606.      IF Q=0 THEN _
  2607.         RETURN
  2608. 4666 CALL CHECKINT (B$)
  2609.      IF EC <> 0 THEN _
  2610.         RETURN
  2611.      X = TESTED.INTEGER.VALUE
  2612.      SUBROUTINE.PARAMETER = 3
  2613.      CALL FILELOCK
  2614.      GET 1,CURRENT.HEADER
  2615.      MID$(MESSAGE.RECORD$,121,2) = MKI$(X)
  2616.      PUT 1,CURRENT.HEADER
  2617.      SUBROUTINE.PARAMETER = 4
  2618.      CALL FILELOCK
  2619.      CALL QTPUT1 ("Security changed to" + STR$(X))
  2620.      RETURN
  2621. 4670 IF SYSOP THEN GOTO 4671
  2622.         IF MSG.RECEIVED = TRUE THEN _                'BK012501
  2623.         A$ = "Already received." + _                'BK012404
  2624.              "  Please enter a NEW message!" : _        'BK012404
  2625.         GOSUB 12976 : _                        'BK012404
  2626.         CALL SKIPLINE (1) : _                    'BK012404
  2627.         JUST.REPLIED = TRUE : _                    'BK012404
  2628.         RETURN 4560                        'BK012404
  2629. 4671 RE.EDIT = TRUE : _                        'BK012201
  2630.      MESSAGE.TO.OLD$ = MESSAGE.TO$ : _                'BK012201
  2631.      MESSAGE.FROM.OLD$ = MESSAGE.FROM$ : _            'BK012201
  2632.      SUBJECT.OLD$ = SUBJECT$ : _                'BK012201
  2633.      MESSAGE.PASSWORD.OLD$ = MESSAGE.PASSWORD$ : _        'BK012201
  2634.      CALL TRIM (MESSAGE.TO$) : _                'BK012201
  2635.      CALL PUTMATTR : _                        'BK012601
  2636.      IF LOW.MESSAGE.NUMBER > 0 AND _                'BK012401
  2637.         ACTIVE.MESSAGES = MAXIMUM.MESSAGES THEN _        'BK012401
  2638.            A$ = "No room for new messages!  Try tomorrow" : _    'BK012401
  2639.            GOSUB 12976 : _                    'BK012401
  2640.            CALL SKIPLINE(2) : _                    'BK012401
  2641.            RETURN 4624                        'BK012401
  2642.      A$ = "TO: (Enter for " + _                    'BK012201
  2643.            MESSAGE.TO$ + _                    'BK012201
  2644.           ")" : _                        'BK012201
  2645.      GOSUB 12995 : _                        'BK012201
  2646.      MESSAGE.TO$ = B$ : _                    'BK012201
  2647.      IF MESSAGE.TO$ = "" THEN _                    'BK012301
  2648.         MESSAGE.TO$ = MESSAGE.TO.OLD$                'BK012301
  2649.      CALL ALLCAPS (MESSAGE.TO$) : _                'BK012301
  2650.      CALL TRIM (MESSAGE.TO$) : _                'BK012301
  2651.      GOSUB 2000 : _                        'BK012301
  2652.      IF (MESSAGE.TO$ = "") OR _                    'BK012201
  2653.         (SUBJECT$ = "") OR _                    'BK012201
  2654.         (MESSAGE.PASSWORD$ = "") THEN _                'BK012201
  2655.            MESSAGE.TO$ = MESSAGE.TO.OLD$ : _            'BK012201
  2656.        SUBJECT$ = SUBJECT.OLD$ : _                'BK012201
  2657.        MESSAGE.PASSWORD$ = MESSAGE.PASSWORD.OLD$ : _    'BK012201
  2658.           CALL QTPUT ("Message UNCHANGED!",1) : _        'BK012201
  2659.           B$ = "" : _                    'BK012201
  2660.           RETURN                        'BK012201
  2661.       LINES.IN.MESSAGE = LINES.IN.MESSAGE - 1 : _        'BK012201
  2662.       RETURN 2299                        'BK012201
  2663. '
  2664. '
  2665. '
  2666. ' ****  O - COMMAND FROM MAIN MENU (OPERATOR PAGE)   ***
  2667. '
  2668. 4700 IF NOT SYSOP.AVAILABLE THEN _
  2669.         A$ = "Sorry, " + _
  2670.              SYSOP.FIRST.NAME$ + _
  2671.              " not available to answer page" : _
  2672.         GOSUB 12979 : _
  2673.         GOTO 4755
  2674. 4705 CALL QTPUT1 ("Chat. Remote Conversation")
  2675.      JJ = VAL(MID$(TIME$,1,2))*100 + VAL(MID$(TIME$,4,2))
  2676.      IF (JJ > START.OFFICE.HOURS AND JJ < END.OFFICE.HOURS) OR SYSOP.ANNOY THEN _
  2677.         GOTO 4710
  2678. 4707 GOTO 4750   'Pe 09/06/89
  2679. 4708 A$ = "SYSOP in from" + _
  2680.           STR$(START.OFFICE.HOURS) + _
  2681.           " to" + _
  2682.           STR$(END.OFFICE.HOURS) + ","
  2683.      GOSUB 12979
  2684.      GOTO 4755
  2685. 4710 A$ = "Page " + _
  2686.           SYSOP.FIRST.NAME$ + _
  2687.           " (Y/[N])"                                                 ' KP061905
  2688.      CALL SKIPLINE (1)
  2689.      GOSUB 12999
  2690.      IF NOT YES THEN _                                               ' KP061905
  2691.         RETURN
  2692.      PAGE.COUNT = 0
  2693.      A$ = "Paging " + _
  2694.           SYSOP.FIRST.NAME$ + _
  2695.           " now"
  2696.      GOSUB 12978
  2697.      CALL SETABORT (PAGE.TIME.MAX!,30)
  2698. 4730 CALL DELAYIT (1)
  2699. 4735 PAGE.COUNT = PAGE.COUNT + 1
  2700.      IF INKEY$ = ESCAPE$ THEN _
  2701.         GOTO 4765
  2702. 4740 IF PAGE.COUNT MOD 2 THEN _
  2703.         A$ = PAGING.PRINTER.SUPPORT$ + _
  2704.              BELL.RINGER$ : _
  2705.         IF LEN(PAGING.PRINTER.SUPPORT$) = 3 THEN _
  2706.            CALL PRINTIT (CHR$(7)) : _
  2707.            IF EC <> 0 THEN _
  2708.               EL = 4740 : _
  2709.               GOTO 13000
  2710. 4745 GOSUB 12978
  2711.      CALL CHECKTIM (PAGE.TIME.MAX!)
  2712.      ON SUBROUTINE.PARAMETER GOTO 4730,4747
  2713. 4747 GOSUB 12979
  2714. 4750 CALL QTPUT1 (SYSOP.FIRST.NAME$ + " not responding")
  2715. 4755 'CALL QTPUT1 ("Try a msg or comment")
  2716.   PAGED.FILE.NAME$ = "PAGED.DEF"             'PAGE MOD
  2717.      CALL BUFFILE (PAGED.FILE.NAME$,X)       'PAGE MOD
  2718.      PAGE.STATUS$ = "Paged!"
  2719.      CALL UPDTCALR ("Operator paged " + LEFT$(TIME$,5),2)
  2720.      RETURN
  2721. 4765 CALL UPDTCALR ("Paged & chatted with Sysop",1)
  2722.      CALL QTPUT1 ("SYSOP in!  " + _
  2723.           FIRST.NAME$ + _
  2724.           ", this is " + _
  2725.           SYSOP.FIRST.NAME$ + _
  2726.           " go ahead!")
  2727.      PAGE.STATUS$ = ""
  2728. 4770 CALL SYSOPCHAT
  2729.      IF SUBROUTINE.PARAMETER < 0 THEN _
  2730.         GOTO 202
  2731.      RETURN
  2732. '
  2733. ' ****  S - COMMAND FROM UTILITY MENU (STATISTICS)  ***
  2734. '
  2735. 4849 GOSUB 4850         'PE 02/10/89
  2736.     CALL ASKMORE ("",TRUE,FALSE,X,TRUE)   'PE 02/10/89
  2737.      RETURN             'PE 02/10/89
  2738. 4850 GOSUB 1893
  2739.         CALL QTPUT (FG.3$+"RBBS-PC " + CX$(4)+VERSION.ID$ +FG.1$+CRLF$+ "NODE " + NODE.ID$ + _
  2740.         CX$(1)+ ", OPERATING AT " +FG.2$+ BAUD.PARITY$,1)
  2741.      A$ = ""
  2742.      IF NOT CONFERENCE.MODE THEN _
  2743.           A$ = "Caller Number................"+STR$(CALLS.TODATE!) + "  "+CRLF$
  2744. 4855 A$ = A$ + "Active Messages.............."+STR$(ACTIVE.MESSAGES)+CRLF$
  2745.      A$ = A$ + "Next Msg Number.............."+STR$(HIGH.MESSAGE.NUMBER + 1)+_
  2746.         CRLF$
  2747.      IF LAST.MESSAGE.READ > 0 THEN _
  2748.      A$ = A$ + "Last msg you read............" + STR$(LAST.MESSAGE.READ)+CRLF$
  2749. 4857 GOSUB 12976
  2750.      IF (NOT SYSOP) AND (USER.SECURITY.LEVEL < SEC.KILL.ANY) THEN _
  2751.         RETURN
  2752.      USER.WORK = (HIGHEST.USER.RECORD * .95) + 1
  2753.      IF MESSAGES.CAN.GROW THEN _
  2754.         Y$ = " open" _
  2755.      ELSE Y$ = STR$(HIGHEST.MESSAGE.RECORD + 1 - NODES.IN.SYSTEM - NEXT.MESSAGE.RECORD)
  2756.      A$ = "USERS: used" + _
  2757.           STR$(CURRENT.USER.COUNT - 1) + _
  2758.           " avl" + _
  2759.           STR$(USER.WORK - CURRENT.USER.COUNT) + _
  2760.           "  MSGS: used" + _
  2761.           STR$(ACTIVE.MESSAGES) + _
  2762.           " avl" + _
  2763.           STR$(MAXIMUM.MESSAGES - ACTIVE.MESSAGES) + _
  2764.           "  MSG REC: used" + _
  2765.           STR$(NEXT.MESSAGE.RECORD - 1) + _
  2766.           " avl" + Y$
  2767.      GOSUB 12976
  2768.      Z$ = UPLOAD.DRIVE.FILE$
  2769.      CALL FINDFREE
  2770.      CALL QTPUT1 ("Upload disk has" + FREE.SPACE$)
  2771.      RETURN
  2772. 4900 IF (NOT LOCAL.USER) OR (NOT SYSOP) THEN _
  2773.         CALL UPDTCALR ("Entered " + GRN$,1)
  2774.      CALL QTPUT1 ("Welcome to " + GRN$)
  2775. 4905 CALL BUFFILE (FILE.NAME$,X)
  2776. 4910 GOSUB 12986
  2777.      GOSUB 5344
  2778.      IF LOF(1) = 0 THEN _
  2779.         DF$ = ACTIVE.MESSAGE.FILE$ : _
  2780.         CLOSE 1 : _
  2781.         KILL ACTIVE.MESSAGE.FILE$ : _
  2782.         GOSUB 12987 : _
  2783.         RETURN 13600
  2784.      GOSUB 23000
  2785.      RETURN
  2786. '
  2787. ' ****  P - COMMAND FROM UTILITY MENU (PASSWORD CHANGE)  ***
  2788. '
  2789. 5110 CALL NEWPASWRD ("Enter new password" + PRESS.ENTER$,TRUE)
  2790.      IF SUBROUTINE.PARAMETER < 0 THEN _
  2791.         GOTO 202
  2792.      IF Q = 0 THEN _
  2793.         RETURN
  2794. 5120 A$ = "Reenter new password"
  2795.      GOSUB 45010
  2796.      IF Q = 0 THEN _
  2797.         RETURN
  2798.      CALL ALLCAPS (B$)
  2799.      IF Z$ <> B$ THEN _
  2800.         A$ = "Passwords don't match!" : _
  2801.         GOSUB 12979 : _
  2802.         RETURN
  2803. 5125 IF MAXIMUM.PASSWORD.CHANGES AND _
  2804.         CHANGES.THIS.SESSION > _
  2805.         MAXIMUM.PASSWORD.CHANGES AND _
  2806.         NOT SYSOP THEN _
  2807.             A$ = "No changes permitted" : _
  2808.             GOSUB 12975 : _
  2809.             RETURN _
  2810.      ELSE PASSWORD.CHANGE.ALLOWED = TRUE : _
  2811.           GOSUB 5140 : _
  2812.           IF NOT FOUND THEN _
  2813.              GOTO 5129 _
  2814.           ELSE A$ = "Temporary change" : _
  2815.                GOSUB 12975 : _
  2816.                PASSWORD$ = TEMP.PASSWORD$ : _
  2817.                SECONDS.PER.SESSION! = TEMP.TIME.ALLOWED * 60 : _
  2818.                USER.SECURITY.LEVEL = TEMP.SECURITY.LEVEL : _
  2819.                GOSUB 41070 : _
  2820.                SYSOP = (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL) : _
  2821.                CALL CALLOPT : _
  2822.                CALL XFERTYPE (2,TRUE)
  2823.      IF ACTIVE.USER.NAME$ = "SYSOP" THEN _
  2824.         B$(1) = "********"
  2825. 5126 CALL UPDTCALR ("Used temp password " + B$,2)
  2826.      RETURN
  2827. 5129 IF ORIG.USER.FILE$ <> ACTIVE.USER.FILE$ THEN _
  2828.         CALL QTPUT1 ("Password Change only in Logon User File") : _
  2829.         RETURN
  2830.      GOSUB 12989
  2831.      CALL OPENUSER (HIGHEST.USER.RECORD)
  2832.      GOSUB 9450
  2833. 5130 IF USER.FILE.INDEX < 1 OR _
  2834.         USER.FILE.INDEX > 32767 THEN _
  2835.         GOTO 5160
  2836.      GET 5,USER.FILE.INDEX
  2837.      CALL ALLCAPS (B$)
  2838.      LSET PASSWORD$ = B$
  2839.      GOSUB 9440
  2840.      GOSUB 12991
  2841.      A$ = "Password changed"
  2842.      STOP.INTERRUPTS = TRUE
  2843.      GOSUB 12975
  2844.      IF MAXIMUM.PASSWORD.CHANGES THEN _
  2845.         CHANGES.THIS.SESSION = CHANGES.THIS.SESSION + 1
  2846. 5131 CALL UPDTCALR ("New Password " + B$(1),2)
  2847.      RETURN
  2848. '
  2849. ' ****  SEARCH "PASSWORDS" FILE FOR TEMPORARY PASSWORDS  ***
  2850. '
  2851. 5135 Z$ = ""
  2852.      Z = 0
  2853.      GOSUB 5140
  2854.      IF NOT FOUND THEN _                                             ' KG072604
  2855.         TEMP.TIME.ALLOWED = MINUTES.PER.SESSION.DEF! : _             ' KG072604
  2856.         TEMP.MAX.PER.DAY = MAX.PER.DAY.DEF _                         ' KG072604
  2857.      ELSE TIME.LOCK.SET = TEMP.TIME.LOCK : _                         ' KG072604
  2858.           IF TEMP.REG.PERIOD > 0 THEN _
  2859.              DAYS.IN.REGISTRATION.PERIOD = TEMP.REG.PERIOD
  2860.      MINUTES.PER.SESSION! = TEMP.TIME.ALLOWED                        ' KG072604
  2861.      MAX.PER.DAY = -(MAX.PER.DAY * (TEMP.MAX.PER.DAY <= 0)) - _      ' KG072604
  2862.                     (TEMP.MAX.PER.DAY * (TEMP.MAX.PER.DAY > 0))      ' KG072604
  2863.      IF LIMIT.MINUTES.PER.SESSION! THEN _
  2864.         IF MINUTES.PER.SESSION! > LIMIT.MINUTES.PER.SESSION! THEN _
  2865.            MINUTES.PER.SESSION! = LIMIT.MINUTES.PER.SESSION!
  2866.      GOSUB 825                                                       ' KG072604
  2867.      RETURN
  2868. 5140 FOUND = FALSE
  2869.      CALL OPENWORK (2,PASSWORDS.FILE$)
  2870.      IF EC = 53 THEN _
  2871.         CALL UPDTCALR ("Missing file " + PASSWORDS.FILE$,2) : _
  2872.         IF Z = 1 THEN _
  2873.            CALL ALLCAPS (B$(1)) : _
  2874.            Z$ = B$(1) : _
  2875.            GOTO 5160 _
  2876.         ELSE GOTO 5160
  2877.      Z$ = Z$ + _
  2878.           SPACE$(15 - LEN(Z$))
  2879. 5150 IF EOF(2) THEN _
  2880.         GOTO 5160
  2881. 5151 CALL GETPASWD
  2882.      IF EC <> 0 THEN _
  2883.         EL = 5151 : _
  2884.         GOTO 13000
  2885.      IF LEN(TEMP.PASSWORD$) > 15 THEN _
  2886.         GOTO 5150
  2887.      TEMP.PASSWORD$ = TEMP.PASSWORD$ + _
  2888.                       SPACE$(15 - LEN(TEMP.PASSWORD$))
  2889.      IF Z$ <> TEMP.PASSWORD$ THEN _
  2890.         GOTO 5150
  2891.      IF PASSWORD.CHANGE.ALLOWED AND _
  2892.         USER.SECURITY.LEVEL >= MINIMUM.SECURITY.FOR.TEMP.PASSWORD THEN _
  2893.         GOTO 5155
  2894.      IF USER.SECURITY.LEVEL <> TEMP.SECURITY.LEVEL THEN _
  2895.         GOTO 5150
  2896.      IF START.TIME = 0 THEN _
  2897.         GOTO 5155
  2898.      WORK.TIME$ = TIME$
  2899.      TEST.TIME = VAL(LEFT$(WORK.TIME$,2) + MID$(WORK.TIME$,4,2))
  2900.      IF TEST.TIME => START.TIME AND TEST.TIME <= END.TIME THEN _
  2901.         GOTO 5155
  2902.      IF END.TIME < START.TIME THEN _
  2903.         IF TEST.TIME => START.TIME OR TEST.TIME <= END.TIME THEN _
  2904.            GOTO 5155
  2905.      GOTO 5150
  2906. 5155 FOUND = TRUE
  2907. 5160 EC = 0
  2908.      RETURN
  2909. 5200 CALL PAGELEN
  2910.      RETURN
  2911. '
  2912. ' ****  J - COMMAND FROM MAIN MENU (JOIN CONFERENCE)  ***
  2913. '
  2914. 5300 A1$ = CONFERENCE.MENU$
  2915.      CALL BRKFNAME (ACTIVE.MESSAGE.FILE$,MSG.DRVPATH$,X$,Y$,TRUE)
  2916.      CALL TALK (12,A$)
  2917. 5301 CALL SUBMENU ("What conference, L)ist, M)ain ([ENTER] quits)",_
  2918.          A1$,MSG.DRVPATH$,_
  2919.          "M.DEF","M",USER.GRAPHIC.DEFAULT$,TRUE,FALSE,FALSE,"C.DEF")
  2920.      IF Q = 0 THEN _
  2921.         RETURN
  2922.      ACTIVE.USER.NAME$ = ORIG.USER.NAME$                          'DGS-ALS
  2923.      FIRST.NAME$ = ORIG.FIRST.NAME$                               'DGS-ALS
  2924.      IF SUBROUTINE.PARAMETER = -1 THEN _
  2925.         RETURN 10595
  2926. 5323 IF Z$ = "M" OR Z$ = "MAIN" THEN _
  2927.         IF GRN$ = "MAIN" THEN _
  2928.            RETURN _
  2929.         ELSE GOTO 5350                                               ' KG081201
  2930.      IF NOT OK THEN _
  2931.         GOTO 5300                                                    ' KG081201
  2932.      CLOSE 2
  2933. '
  2934. ' ****  UPDATE PREVIOUS MESSAGE BASE CHECKPOINT RECORD  ***
  2935. '
  2936. 5324 PREV.GRN$ = GRN$
  2937.      GRN$ = Z$
  2938.      GRN.NAME$ = GRN$
  2939.      GRN.SAVE$ = GRN$
  2940.      GOSUB 5342                                  'Pe 09/10/89
  2941.      PREV.MESSAGE$ = ACTIVE.MESSAGE.FILE$
  2942.      ACTIVE.MESSAGE.FILE$ = FILE.NAME$
  2943.      GOSUB 5343
  2944. '
  2945. ' ****  UPDATE PREVIOUS USER RECORD  ***
  2946. '
  2947. 5325 GOSUB 5380
  2948. '
  2949. ' *****  CHECK WHETHER HAVE SUBBOARD (I.E. CONFIG.DEF EXISTS)  ****
  2950. '
  2951. 5327 USER.RECORD.HOLD$ = USER.RECORD$
  2952.      CONFERENCE.MODE.SAVE = CONFERENCE.MODE
  2953.      CONFERENCE.MODE = TRUE
  2954.      PREV.USER$ = ACTIVE.USER.FILE$
  2955.      PREV.INDEX = USER.FILE.INDEX
  2956.      PREV.MAIN.USER$ = MAIN.USER.FILE$
  2957.      PREV.USL = USER.SECURITY.LEVEL
  2958.      PREV.DEF$ = CURRENT.DEF$
  2959. 5328 X$ = GRN$ + _
  2960.           "C.DEF"
  2961.      CALL FINDIT (X$)
  2962.      SUB.BOARD = OK
  2963.      IF NOT SUB.BOARD THEN _
  2964.         CALL BRKFNAME (MAIN.MESSAGE.FILE$,MSG.DRVPATH$,DF$,Y$,TRUE) : _
  2965.         X$ = MSG.DRVPATH$ + X$ : _
  2966.         CALL FINDIT (X$) : _
  2967.         SUB.BOARD = OK
  2968.      IF SUB.BOARD THEN _
  2969.         IF LEN(GRN$) = 7 THEN _
  2970.            IF LEFT$(GRN$,4) = "RBBS" AND RIGHT$(GRN$,2) = "PC" THEN _
  2971.               SUB.BOARD = FALSE
  2972.      IF NOT SUB.BOARD THEN _
  2973.         CALL BRKFNAME (ACTIVE.USER.FILE$,USR.DRVPATH$,DF$,Y$,TRUE) : _
  2974.         X$ = USR.DRVPATH$ + _
  2975.              GRN$ + _
  2976.              "U.DEF" : _
  2977.         FILE.NAME$ = WELCOME.FILE.DRV.PATH$ + _
  2978.                      GRN$ + _
  2979.                      "W.DEF" _
  2980.         ELSE CALL READDEF (X$) : _
  2981.              IF EC > 0 THEN _
  2982.                 CALL UPDTCALR ("Error"+STR$(EC)+" reading config file "+X$,2) : _
  2983.                 EC = 0 : _
  2984.                 IN.CONF.MENU = FALSE : _
  2985.                 A$ = "error reading subboard" : _
  2986.                 GOTO 5341 _
  2987.              ELSE X$ = MAIN.USER.FILE$ : _
  2988.                   FILE.NAME$ = "" : _
  2989.                   CALL FINDIT (MAIN.MESSAGE.FILE$) : _
  2990.                   IF NOT OK THEN _
  2991.                      A$ = "msg file missing for" : _
  2992.                      IN.CONF.MENU = FALSE : _
  2993.                      GOTO 5341 _
  2994.                   ELSE ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$ : _
  2995.                        GOSUB 5343
  2996.      UPDATE.DATE = TRUE
  2997.      CALL FINDIT (X$)
  2998.      IF OK THEN _
  2999.         GOTO 5330
  3000. '
  3001. ' *****  NO USER FILE - A PUBLIC CONFERENCE   ****
  3002. '
  3003.      MAIN.USER.FILE$ = PREV.MAIN.USER$
  3004.      IF (USER.SECURITY.LEVEL < AUTO.ADD.SECURITY) THEN _
  3005.         GOTO 5340
  3006.      GOTO 5345
  3007.      'X$ = MAIN.USER.FILE$
  3008.      'SYSOP.PASSWORD.1$ = ""
  3009.      'SYSOP.PASSWORD.2$ = ""
  3010. '
  3011. ' ****  CHECK CONFERENCE USER'S FILE  ***
  3012. '
  3013. 5330 ACTIVE.USER.FILE$ = X$
  3014.      IF MAIN.USER.FILE.INDEX < 1 THEN _
  3015.         FOUND = FALSE : _
  3016.         USER.FILE.INDEX = 0 : _
  3017.         GOTO 5335
  3018.      CALL WORDINFILE (CONFERENCE.MENU$,GRN$,IN.CONF.MENU)
  3019.      IF ACTIVE.USER.NAME$ = "SYSOP" THEN _
  3020.         TEMP.HASH.VALUE$ = ORIG.USER.NAME$
  3021.      GOSUB 12598
  3022.      GOSUB 12984
  3023. 5335 IF FOUND THEN _
  3024.         ADD.TO.CONF = FALSE : _
  3025.         GOSUB 9500 : _
  3026.         MAIN.USER.FILE.INDEX = -(SUB.BOARD * USER.FILE.INDEX)_
  3027.                                -((NOT SUB.BOARD) * MAIN.USER.FILE.INDEX) : _
  3028.         TEMP = -(SUB.BOARD * MINIMUM.LOGON.SECURITY) _
  3029.                -((NOT SUB.BOARD) * AUTO.ADD.SECURITY) : _
  3030.         I = (USER.SECURITY.LEVEL < ORIG.MIN.SEC) : _
  3031.         J = (USER.SECURITY.LEVEL < TEMP) : _
  3032.         K = (I AND J) : _
  3033.         IF K THEN _
  3034.            A$ = "you have been locked out of" : _
  3035.            GOTO 5341 _
  3036.         ELSE GOSUB 5375 : _
  3037.              GOTO 5345
  3038. '
  3039. ' **** USER NOT FOUND.  AUTO-ADD TO SUBBOARD IF SUFFICIENT SECURITY ***
  3040. '
  3041.      IF SUB.BOARD THEN _
  3042.         AUTO.ADD.SECURITY = MINIMUM.LOGON.SECURITY
  3043.      IF (USER.SECURITY.LEVEL >= AUTO.ADD.SECURITY) AND _
  3044.         (USER.FILE.INDEX > 0) AND (MAIN.USER.FILE.INDEX > 0) THEN _
  3045.         GOSUB 5365 : _
  3046.         LSET USER.RECORD$ = USER.RECORD.HOLD$ : _                    ' KG090202
  3047.         IF NOT YES THEN _
  3048.            CALL QTPUT1 ("MEMBER privileges granted in " + GRN$) : _  ' KG090202
  3049.            MID$(USER.OPTIONS$,3,2) = MKI$(0) : _
  3050.            MID$(USER.OPTIONS$,1,2) = MKI$(0) : _
  3051.            ACTIVE.USER.NAME$ = LEFT$(USER.RECORD.HOLD$,30) : _
  3052.            CALL TRIM (ACTIVE.USER.NAME$) : _
  3053.            TEMP = -(SUB.BOARD * ORIG.SECURITY) _
  3054.                   -((NOT SUB.BOARD) * USER.SECURITY.SAVE) : _
  3055.            GOSUB 5370 : _
  3056.            TEMP = -(A * SYSOP.SECURITY.LEVEL) - ((NOT A) * TEMP) : _
  3057.            LSET SECURITY.LEVEL$ = MKI$(TEMP) : _
  3058.            USER.SECURITY.LEVEL = TEMP : _
  3059.            PAGE.LENGTH = PAGE.LENGTH.DEF : _                         ' KG080801
  3060.            GOSUB 12986 : _
  3061.            GOSUB 12630 : _
  3062.            UPDATE.DATE = TRUE : _
  3063.            FOUND = TRUE : _
  3064.            GOTO 5335 _
  3065.         ELSE JUST.BROWSING = TRUE
  3066.      IF USER.SECURITY.LEVEL >= AUTO.ADD.SECURITY THEN _
  3067.         CALL QTPUT1 ("GUEST privileges granted in " + GRN$) : _
  3068.         ACTIVE.USER.FILE$ = PREV.USER$ : _
  3069.         UPDATE.DATE = FALSE : _
  3070.         USER.FILE.INDEX = PREV.INDEX : _
  3071.         GOSUB 5382 : _                                               ' KG073101
  3072.         USER.FILE.INDEX = 0 : _                                      ' KG072702
  3073.         GOTO 5345
  3074.      ADD.TO.CONF = FALSE
  3075. 5340 IF IN.CONF.MENU THEN _
  3076.         A$ = "you are not in conference" _
  3077.      ELSE A$ = "no such option"
  3078. 5341 A$ = A$ + " " + GRN$
  3079.  
  3080. '
  3081. ' ****  CANNOT JOIN THE REQUESTED CONFERENCE.  THEREFORE, GO BACK  ***
  3082. '
  3083.      GOSUB 1397
  3084.      GRN$ = PREV.GRN$
  3085.      GRN.NAME$ = GRN$
  3086.      IF SUB.BOARD THEN _
  3087.         CALL READDEF (PREV.DEF$)
  3088.      ACTIVE.MESSAGE.FILE$ = PREV.MESSAGE$
  3089.      GOSUB 5343
  3090.      USER.FILE.INDEX = PREV.INDEX
  3091.      ACTIVE.USER.FILE$ = PREV.USER$
  3092.      GOSUB 5382
  3093.      CONFERENCE.MODE = CONFERENCE.MODE.SAVE
  3094.      GOSUB 12987
  3095.      ANS.INDEX = 0
  3096.      LAST.INDEX = 0                                                  ' KG082501
  3097.      GOTO 5301                                                       ' KG061501
  3098. '
  3099. ' ****  UPDATE POINTERS FOR A MESSAGE BASE   ****  'Pe 09/10/89
  3100. '  added to 17-2b from 17D    pe 09/10/89
  3101. 5342 GOSUB 12986
  3102.      GOSUB 5344
  3103.      GET 1,1
  3104.      GOSUB 24000
  3105.      GOSUB 12985
  3106.      RETURN
  3107. '
  3108. '
  3109. ' ****  RESTORE A MESSAGE BASE   ***
  3110. '
  3111. 5343 GOSUB 5344
  3112.      GOSUB 23000
  3113.      RETURN
  3114. '
  3115. ' *****  OPEN AND SETUP MESSAGE BASE  *****
  3116. '
  3117. 5344 CALL OPENMSG
  3118.      IF EC = 64 THEN _
  3119.         EC = 0 : _
  3120.         GOTO 5350
  3121.      FIELD 1, 128 AS MESSAGE.RECORD$
  3122.      RETURN
  3123. '
  3124. ' *****  SUCCESSFUL CONFERENCE JOIN  ****
  3125. '
  3126. 5345 DGS.STL$ = ""                                                'DGS-ALS
  3127.      WHILE DGS.ALIAS$ = ""                                        'DGS-ALS
  3128.     CALL DGSALIAS (GRN$,ORIG.USER.NAME$,DGS.ALIAS$, _         'DGS-ALS
  3129.                DGS.STL$,DGS.FILE.NAME$)                   'DGS-ALS
  3130.      WEND                                                         'DGS-ALS
  3131.      DGS.ALIAS$=""                                                'DGS-ALS 
  3132.     GRN$ = GRN$ + " " + MID$("ConferenceSubboard",1-10*SUB.BOARD,10)
  3133.      IF UPDATE.DATE THEN _
  3134.         BOARD.CHECK.DATE$ = LAST.DATE.TIME.ON$ : _
  3135.         LSET LAST.DATE.TIME.ON$ = CURRENT.DATE$ + _
  3136.                                   " " + _
  3137.                                   TIME.LOGGED.ON$ : _
  3138.         GOSUB 9440 : _
  3139.         GOSUB 12991
  3140.      IF GLOBAL.SYSOP THEN _
  3141.         ACTIVE.USER.NAME$ = "SYSOP"
  3142. 5347 GOSUB 4900
  3143. 5348 GOSUB 12987
  3144.      GOSUB 12990
  3145.      IF SUB.BOARD THEN _
  3146.         HAS.DOORED = FALSE : _
  3147.         ACTIVE.FMS.DIRECTORY$ = "" : _
  3148.         RETURN 108
  3149.         GOSUB 827                                'Pe 09/10/89
  3150. '     IF UPDATE.DATE THEN _
  3151. '        BOARD.CHECK.DATE$ = LAST.DATE.TIME.ON$ : _
  3152. '        LSET LAST.DATE.TIME.ON$ = CURRENT.DATE$ + _
  3153. '                                  " " + _
  3154. '                                  TIME.LOGGED.ON$ : _
  3155. '        GOSUB 9440 : _
  3156. '        GOSUB 12991
  3157.      IF PREV.USL <> USER.SECURITY.LEVEL THEN _
  3158.         CALL CALLOPT
  3159.      RETURN 852
  3160. '
  3161. ' ****  JOIN M)AIN   ***
  3162. '
  3163. 5350 IF GRN$ <> "MAIN" THEN _
  3164.         CALL QTPUT1 ("Rejoining " + ORIG.MSG.NAME$)
  3165.      ACTIVE.USER.NAME$ = ORIG.USER.NAME$                          'DGS-ALS
  3166.      FIRST.NAME$ = ORIG.FIRST.NAME$                               'DGS-ALS
  3167.      UPLOADS = GLOBAL.UPLOADS
  3168.      DOWNLOADS = GLOBAL.DOWNLOADS
  3169.      DL.TODAY! = GLOBAL.DL.TODAY!
  3170.      BYTES.TODAY! = GLOBAL.BYTES.TODAY!
  3171.      DLBYTES! = GLOBAL.DLBYTES!
  3172.      ULBYTES! = GLOBAL.ULBYTES!
  3173.      GRN$ = "MAIN"
  3174.      GRN.NAME$ = ORIG.MSG.NAME$
  3175.      TURBO.LOGON = TRUE
  3176.      Q = 0
  3177.      IN.CONF.MENU = TRUE
  3178.      IF ACTIVE.USER.NAME$ = "SYSOP" THEN _
  3179.         ACTIVE.USER.NAME$ = SYSOP.PASSWORD.1$ + " " + SYSOP.PASSWORD.2$
  3180.      CONFIG.FILENAME$ = ORIG.CONFIG$
  3181.      CALL READDEF (CONFIG.FILENAME$)
  3182.      IF ORIG.MESSAGE.FILE$ <> ACTIVE.MESSAGE.FILE$ THEN _            ' KG061501
  3183.         ACTIVE.MESSAGE.FILE$ = ORIG.MESSAGE.FILE$ : _
  3184.         GOSUB 5343
  3185.      IF ORIG.USER.FILE$ <> ACTIVE.USER.FILE$ THEN _
  3186.         GOSUB 5380 : _
  3187.         ACTIVE.USER.FILE$ = ORIG.USER.FILE$ : _
  3188.         ACTIVE.USER.NAME$ = ORIG.USER.NAME$ : _                      ' KG052005
  3189.         GOSUB 12598 : _
  3190.         GOSUB 12990 : _
  3191.         IF FOUND THEN _
  3192.            GOSUB 9500 : _
  3193.            MAIN.USER.FILE.INDEX = USER.FILE.INDEX : _
  3194.            CALL CALLOPT : _
  3195.            CALL XFERTYPE (2,TRUE) _
  3196.         ELSE USER.FILE.INDEX = 0 : _
  3197.              MAIN.USER.FILE.INDEX = 0
  3198.      IF LOCAL.USER.MODE OR NOT LOCAL.USER THEN _
  3199.         CALL UPDTCALR ("Exited Conference",1)
  3200.      GOSUB 2350
  3201. 5360 CONFERENCE.MODE = FALSE
  3202.      SUB.BOARD = TRUE
  3203.      GOSUB 12987
  3204.      RETURN 108
  3205. 5365 IF ADD.TO.CONF THEN _
  3206.         ADD.TO.CONF = FALSE : _
  3207.         YES = FALSE : _
  3208.         RETURN
  3209.      TURBO.KEY = -TURBO.KEY.USER
  3210.      A$ = "Browse conference without permanently joining (Y,[N])"
  3211.      GOSUB 12995
  3212.      RETURN
  3213. 5370 A = (ACTIVE.USER.NAME$ = SYSOP.PASSWORD.1$ + " " + SYSOP.PASSWORD.2$)
  3214.      GLOBAL.SYSOP = (GLOBAL.SYSOP OR (A AND ORIG.CONFIG$ = CONFIG.FILENAME$))
  3215.      IF GLOBAL.SYSOP THEN _
  3216.         A = TRUE
  3217.      RETURN
  3218. 5375 IF ((USER.SECURITY.LEVEL < AUTO.UPGRADE.SEC) AND SUB.BOARD) OR _
  3219.         ((USER.SECURITY.LEVEL < ORIG.UPGRADE.SEC) AND NOT SUB.BOARD) THEN _
  3220.            IF USER.SECURITY.LEVEL <> ORIG.SECURITY THEN _
  3221.               USER.SECURITY.LEVEL = ORIG.SECURITY : _
  3222.               LSET SECURITY.LEVEL$ = MKI$(USER.SECURITY.LEVEL)
  3223.      RETURN
  3224. '
  3225. ' *****  UPDATE CURRENT USERS RECORD  ****
  3226. '
  3227. 5380 IF USER.FILE.INDEX < 1 THEN _
  3228.         RETURN
  3229.      IF ADJUSTED.SECURITY AND NOT SYSOP THEN _
  3230.         LSET SECURITY.LEVEL$ = MKI$(USER.SECURITY.LEVEL) : _
  3231.         USER.SECURITY.SAVE = USER.SECURITY.LEVEL
  3232.      IF SUB.BOARD THEN _                                          'DGS-ALS
  3233.     ACTIVE.USER.NAME$ = ORIG.USER.NAME$ : _                   'DGS-ALS
  3234.     FIRST.NAME$ = ORIG.FIRST.NAME$                            'DGS-ALS
  3235.      CALL UPDATEU (FALSE)
  3236.      RETURN
  3237. '
  3238. ' *****  RESTORE A USER RECORD  ****
  3239. '
  3240. 5382 IF USER.FILE.INDEX < 1 THEN _
  3241.         USER.SECURITY.LEVEL = DEFAULT.SECURITY.LEVEL : _
  3242.         RETURN
  3243.      CALL OPENUSER (HIGHEST.USER.RECORD)
  3244.      GET 5,USER.FILE.INDEX
  3245.      GOSUB 9500
  3246.      RETURN
  3247. '
  3248. ' *****  R - COMMAND FROM UTILITY MENU (REVIEW PROFILE)  ****
  3249. '
  3250. 5400 CALL QTPUT (CHR$(12),0)      'Pe CLS mod
  3251.      CALL QTPUT1 ("Your PROFILE ...............")
  3252. 5410 CALL TOGGLE(-9)
  3253.      GOSUB 43020
  3254.      FF = INSTR(DFLTXFER$,USER.TRANSFER.DEFAULT$)
  3255.      CALL TOGGLE(-5)
  3256.      GOSUB 42810
  3257.      CALL TOGGLE(-3)
  3258.      CALL TOGGLE(-6)
  3259.      CALL TOGGLE(-7)
  3260.      CALL TOGGLE(-10)
  3261.      CALL TOGGLE(-2)
  3262.      CALL TOGGLE(-4)
  3263.      CALL TOGGLE(-8)
  3264.      CALL TOGGLE(-1)
  3265.      IF RESTRICT.BY.DATE THEN _
  3266.         IF USER.SECURITY.LEVEL > EXPIRED.SECURITY THEN _
  3267.            CALL QTPUT1 ("Registration expires " + EXPIRATION.DATE$)
  3268.      RETURN
  3269. 5450 CALL QTPUT (CHR$(12),0)
  3270.      CALL QTPUT ("Your Current setup...",1)
  3271.      CALL QTPUT (FG.1$ +"USER NAME : " + ACTIVE.USER.NAME$,1)
  3272.       CALL QTPUT (FG.2$ +"SECURITY  :" + STR$(USER.SECURITY.SAVE),1)
  3273.       CALL QTPUT (FG.4$+"PASSWORD  : " + PASSWORD.SAVE$,1)
  3274.       CALL QTPUT (FG.3$+"READ MSG. :" + STR$(LAST.MESSAGE.READ),1)
  3275.       CALL QTPUT (CX$(7)+"TIMES ON  :" + STR$(TIMES.LOGGED.ON),1)
  3276.       CALL QTPUT (FG.1$+"LAST ON   : " + LAST.DATE.TIME.ON.SAVE$,1)
  3277.       CALL QTPUT (FG.4$+"DOWNLOADS :" + STR$(DOWNLOADS),1)
  3278.       CALL QTPUT ("UPLOADS   :" + STR$(UPLOADS),1)
  3279.       CALL QTPUT (FG.2$+"DL-BYTES  :" + STR$(DLBYTES!),1)
  3280.       CALL QTPUT ("UL-BYTES  :" + STR$(ULBYTES!),1)
  3281.       IF RESTRICT.BY.DATE THEN _
  3282.          CALL QTPUT (CX$(7)+"EXPIRATION: " + EXPIRATION.DATE$,1)
  3283.       CALL QTPUT (CX$(5)+"USER MODE : "+MID$("NoviceExpert",1 -6 * EXPERT.USER,6),1)
  3284.       CALL QTPUT (CX$(6)+"GRAPHICS  : " +   MID$("None AsciiColor",GR * 5 + 1,5),1)
  3285.       CALL QTPUT (FG.3$+"PROTOCOL  : " +  USER.TRANSFER.DEFAULT$,1)
  3286.       CALL QTPUT (FG.1$+"UPPER CASE: " +  MID$("and lowerONLY", 1 - 9 * UPPER.CASE,9),1)
  3287.       CALL QTPUT (CX$(8)+"Line Feeds: " + FNOFFON$(LINE.FEEDS),1)
  3288.       CALL QTPUT (CX$(7)+"Nulls     : " + FNOFFON$(NULLS),1)
  3289.       CALL TOGGLE (-8)
  3290.       CALL TOGGLE (-5)
  3291.       CALL TOGGLE (-10)
  3292.       CALL TOGGLE (-2)
  3293.       CALL TOGGLE (-4)
  3294. CALL ASKMORE ("",TRUE,FALSE,X,TRUE)
  3295. RETURN
  3296. '
  3297. '
  3298. ' *****  B - COMMAND FROM UTILITY MENU (300 TO 450 BAUD CHANGE)  ****
  3299. '
  3300. 5500 CALL BAUD450
  3301.      IF LOCAL.USER OR NOT (SUBROUTINE.PARAMETER OR C = 20) THEN _
  3302.         RETURN
  3303. 5502 RETURN 10595  'Entry point when have double nested gosub
  3304. '
  3305. ' *****  V - COMMAND FROM MAIN MENU (VIEW CONFERENCES)  ****
  3306. '
  3307. 5800 CALL CONFMAIL (MAILCHECK.CONFIRM)
  3308.      CONFMAIL.JOIN = (HOME.CONFERENCE$ <> "")
  3309.      RETURN
  3310. '
  3311. ' *  FORMAT MESSAGE HEADER INFORMATION FOR DISPLAY
  3312. '
  3313. 8000 IF RET THEN _
  3314.         RETURN
  3315. 8020  MSG.RECEIVED = FALSE                    'BK012501
  3316.       IF MID$(MESSAGE.RECORD$,37,5) = "ALL  " THEN _
  3317.         MESSAGE.TO$ = "ALL" : _
  3318.         GOTO 8040
  3319. 8030 MESSAGE.TO$ = MID$(MESSAGE.RECORD$,37,22)
  3320.      CALL TRIM (MESSAGE.TO$)
  3321. 8040 IF LEN(MESSAGE.TO$) < 23 THEN _
  3322.         MESSAGE.TO$ = MESSAGE.TO$ + _
  3323.                       SPACE$(23 - LEN(MESSAGE.TO$))
  3324.      SUBJECT$ = MID$(MESSAGE.RECORD$,76,25)
  3325.      CALL TRIM (SUBJECT$)
  3326.      ORIG.SUBJECT$ = SUBJECT$
  3327.      IF PASSWORD.FAILED THEN _
  3328.         SUBJECT$ = SJ$
  3329. 8050 MESSAGE.FROM$ = MID$(MESSAGE.RECORD$,6,31)
  3330.      CALL TRIM (MESSAGE.FROM$)
  3331.      IF LEN(MESSAGE.FROM$) < 23 THEN _
  3332.         MESSAGE.FROM$ = MESSAGE.FROM$ + _
  3333.                         SPACE$(23 - LEN(MESSAGE.FROM$))
  3334.      IF USER.SECURITY.LEVEL >= SEC.CHANGE.MSG THEN _
  3335.         YY$ = "  Security:" + _
  3336.               STR$(MESSAGE.SECURITY) _
  3337.         ELSE YY$ = ""
  3338.      IF MID$(MESSAGE.RECORD$,101,1) = "!" THEN _
  3339.         MID$(MESSAGE.RECORD$,1,1) = "!"
  3340.      A$ = FG.1$ + "Msg #: " + _
  3341.           LEFT$(MESSAGE.RECORD$,5) + _
  3342.           YY$ + SPACE$ (22-LEN(YY$)) + GRN$                          ' KG090204
  3343.      YY$ = FG.4$ + "   Sent: " + _
  3344.           MID$(MESSAGE.RECORD$,68,8) + _
  3345.           " " + _
  3346.           MID$(MESSAGE.RECORD$,59,5)
  3347.      IF NOT RET THEN _
  3348.         IF READ.MESSAGES THEN _
  3349.            CALL QTPUT1 (A$): _
  3350.            X$ = MESSAGE.FROM$ : _
  3351.            CALL CHKCOLOR (X$,SEARCH.HEADER$,FG.2$) : _
  3352.            CALL QTPUT1 (FG.2$ + " From:  " + X$ + YY$) : _
  3353.            GOSUB 8076 : _
  3354.            X$ = MESSAGE.TO$ : _
  3355.            CALL CHKCOLOR (X$,SEARCH.HEADER$,FG.3$) : _
  3356.            CALL QTPUT1 (FG.3$ + "   To:  " + X$ + "  " + FG.2$ + YY$) : _
  3357.            CALL CHKCOLOR (SUBJECT$,SEARCH.HEADER$,FG.4$) : _
  3358.            A$ = FG.4$ + "   Re:  " + _
  3359.                 SUBJECT$ + EMPHASIZE.OFF$ _
  3360.         ELSE A$ = FG.1$ + LEFT$(MESSAGE.RECORD$,5) + _
  3361.                   " " + _
  3362.                   MID$(MESSAGE.RECORD$,68,5) + _
  3363.                   " " + _
  3364.                   + FG.2$ + LEFT$(MESSAGE.FROM$,18) + _
  3365.                   " -> " + _
  3366.                   + FG.3$ + LEFT$(MESSAGE.TO$,19) + _
  3367.                   " " + _
  3368.                   + FG.4$ + LEFT$(SUBJECT$,24) + EMPHASIZE.OFF$ : _
  3369.              CALL CHKCOLOR (A$,SEARCH.HEADER$,"") : _
  3370.              GOTO 8080
  3371.      IF QUICK.SCAN.MESSAGES OR _
  3372.         SCAN.MESSAGES THEN _
  3373.            GOTO 8080 _
  3374.      ELSE GOTO 8077
  3375. 8076 IF MID$(MESSAGE.RECORD$,123,6) = STRING$(6,0) OR _
  3376.         MID$(MESSAGE.RECORD$,123,6) = SPACE$(6) THEN _
  3377.            YY$ = " Rcvd: -NO-" : _
  3378.            MSG.RECEIVED = FALSE : _                'BK012501
  3379.            RETURN
  3380.      YY$ = " Rcvd: " + _
  3381.            RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,123,1))),2) + _
  3382.            "-" + _
  3383.            RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,124,1))),2) + _
  3384.            "-" + _
  3385.            RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,125,1))),2) + _
  3386.            " " + _
  3387.            RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,126,1))),2) + _
  3388.            ":" + _
  3389.            RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,127,1))),2)
  3390.      MSG.RECEIVED = TRUE                    'BK012501
  3391.      FOR I = 8 TO 15
  3392.         IF MID$(YY$,I,1) = " " THEN _
  3393.            MID$(YY$,I,1) = "0"
  3394.      NEXT
  3395.      FOR I = 17 TO 21
  3396.         IF MID$(YY$,I,1) = " " THEN _
  3397.            MID$(YY$,I,1) = "0"
  3398.      NEXT
  3399.      RETURN
  3400. 8077 IF (NOT MSG.TO.CALLER) THEN _
  3401.         A = (MID$(MESSAGE.RECORD$,37,5) = "ALL  ") : _
  3402.         IF NOT A THEN _
  3403.            GOTO 8080
  3404.      IF MSG.FROM.CALLER THEN _
  3405.         GOTO 8080
  3406.      YY$ = DATE$
  3407.      WK$ = TIME$
  3408.      MID$(MESSAGE.RECORD$,123,6) = CHR$(VAL(MID$(YY$,1,2))) + _
  3409.                                    CHR$(VAL(MID$(YY$,4,2))) + _
  3410.                                    CHR$(VAL(MID$(YY$,9,2))) + _
  3411.                                    CHR$(VAL(MID$(WK$,1,2))) + _
  3412.                                    CHR$(VAL(MID$(WK$,4,2))) + _
  3413.                                    CHR$(VAL(MID$(WK$,7,2)))
  3414.      GOSUB 12986
  3415.      PUT 1,M(MESSAGE.DIM.INDEX,1)
  3416.      GOSUB 12987
  3417. 8080 GOSUB 12979
  3418.      A$ = ""
  3419.      RETURN
  3420. '
  3421. ' * UNCOMPRESS MESSAGE PRIOR TO DISPLAY
  3422. '
  3423. 9000 IF NOT JUST.SEARCHING THEN _
  3424.         GOSUB 4656: _                                                ' KG060901
  3425.         CALL SKIPLINE (1) : _
  3426.         LINES.IN.MESSAGE = 1 : _
  3427.         ADIMX = 150 : _
  3428.         REDIM A$(ADIMX) : _
  3429.         REMAIN$ = "" : _
  3430.         IF NOT QUOTED.REPLY THEN _
  3431.            DONT.PRINT = FALSE
  3432.      FOR X = 2 TO VAL(MID$(MESSAGE.RECORD$,117,4))
  3433.         J = 1
  3434.         GET 1
  3435.         IF JUST.SEARCHING THEN _
  3436.            A$ = MESSAGE.RECORD$ : _
  3437.            CALL ALLCAPS (A$) : _
  3438.            HIGHLITE.POS = INSTR(A$,SEARCH.STRING$) : _
  3439.            IF HIGHLITE.POS > 0 THEN _
  3440.               HIGHLITE.REC = LOC(1) : _
  3441.               X = 9999 : _
  3442.               GOTO 9090 _
  3443.            ELSE GOTO 9090
  3444. 9050    B = INSTR(J,MESSAGE.RECORD$,CHR$(227))
  3445.         IF RET THEN _
  3446.            RETURN
  3447. 9060    C = B - J
  3448.         IF C < 0 THEN _
  3449.            C = 128
  3450. 9070    A$ = MID$(MESSAGE.RECORD$,J,C)
  3451.         IF HIGHLITE.REC = LOC(1) THEN _
  3452.            IF HIGHLITE.POS >= J AND HIGHLITE.POS < J+C THEN _
  3453.               HIGHLITE.REC = -1 : _
  3454.               CALL BRACKET (A$,HIGHLITE.POS-J+1,HIGHLITE.POS+LEN(SEARCH.STRING$)-J,EMPHASIZE.ON$,EMPHASIZE.OFF$)
  3455.         IF B = 0 THEN _
  3456.            REMAIN$ = A$ : _
  3457.            GOTO 9090 _
  3458.         ELSE A$ = REMAIN$ + A$ : _
  3459.              REMAIN$ = "" : _
  3460.              J = B + 1
  3461. 9085    IF LEFT$(A$,1) = START.OF.HEADER$ OR _
  3462.            LEFT$(A$,LEN(SCREEN.OUT.MSG$)) = SCREEN.OUT.MSG$ THEN _
  3463.            GOTO 9050
  3464.         A$(LINES.IN.MESSAGE) = A$
  3465.         LINES.IN.MESSAGE = LINES.IN.MESSAGE + 1
  3466.         IF LINES.IN.MESSAGE > ADIMX THEN _
  3467.            LINES.IN.MESSAGE = LINES.IN.MESSAGE - 1 : _
  3468.            CALL SKIPLINE (1) : _
  3469.            CALL QTPUT1 ("Message too long.  Truncated to " + STR$(ADIMX) + " lines!") : _
  3470.            A$ = "" : _
  3471.            RETURN
  3472.         IF DONT.PRINT = FALSE THEN _
  3473.            CALL QTPUT1 (A$) : _
  3474.            IF RET THEN _
  3475.               A$ = "" : _
  3476.               RETURN
  3477.            CALL ASKMORE ("",TRUE,TRUE,ANS.INDEX,FALSE)               ' KG081201
  3478.            IF NO THEN _
  3479.               DONT.PRINT = TRUE
  3480.         GOTO 9050
  3481. 9090 NEXT
  3482.      IF DONT.PRINT = TRUE THEN _
  3483.         GOTO 5160
  3484.      IF JUST.SEARCHING AND HIGHLITE.POS > 0 THEN _
  3485.         JUST.SEARCHING = FALSE : _
  3486.         GET 1,M(MESSAGE.DIM.INDEX,1) : _
  3487.         GOSUB 8000 : _
  3488.         GOTO 9000
  3489.      A$ = ""
  3490.      RETURN
  3491. '
  3492. ' *  C - COMMAND FROM UTILITY MENU (CLOCK - TIME ON SYSTEM)
  3493. '
  3494. 9099 GOSUB 9100                          'Pe 02/11/89
  3495.      CALL ASKMORE ("",TRUE,FALSE,X,TRUE) 'Pe 02/11/89
  3496.      RETURN                              'PE 02/11/89
  3497. 9100 CALL RPTTIME
  3498.      RETURN
  3499. '
  3500. ' * WRITE A RECORD TO THE RBBS-PC "USER" FILE
  3501. '
  3502. 9440 IF USER.FILE.INDEX > 0 AND USER.FILE.INDEX < 32768 THEN _
  3503.         PUT 5,USER.FILE.INDEX
  3504.      RETURN
  3505. '
  3506. ' * DEFINE USER FILE RECORD VARIABLES TO COMPENSATE FOR THE BUG IN QUICKBASIC
  3507. ' * THAT REQUIRES A FIELD STATMENT TO BE EXECUTED WITHIN EACH SEPARATELY
  3508. ' * COMPILED PROGRAM -- EVEN THOUGH A FIELD STATEMENT WAS EXECUTED WHEN THE
  3509. ' * FILE WAS OPENED IN ANOTHER SEPERATELY COMPILED SUBROUTINE
  3510. '
  3511. 9450 IF LOF(5) < 1 THEN _
  3512.         DF$ = ACTIVE.USER.FILE$ : _
  3513.         RETURN 13600
  3514.      FIELD 5,31 AS USER.NAME$, _
  3515.              15 AS PASSWORD$, _
  3516.               2 AS SECURITY.LEVEL$, _
  3517.              14 AS USER.OPTIONS$,  _
  3518.              24 AS CITY.STATE$, _
  3519.               3 AS MACHINE.TYPE$, _
  3520.               4 AS TODAY.DL$, _
  3521.               4 AS TODAY.BYTES$, _
  3522.               4 AS DL.BYTES$, _
  3523.               4 AS UL.BYTES$, _
  3524.              14 AS LAST.DATE.TIME.ON$, _
  3525.               3 AS LIST.NEW.DATE$, _
  3526.               2 AS USER.DOWNLOADS$, _
  3527.               2 AS USER.UPLOADS$, _
  3528.               2 AS ELAPSED.TIME$
  3529.      FIELD 5,128 AS USER.RECORD$
  3530.      RETURN
  3531. '
  3532. ' * GET USER DEFAULTS
  3533. '
  3534. 9500 GOSUB 9450
  3535.      GOSUB 5370
  3536.      IF A THEN _
  3537.         USER.SECURITY.LEVEL = SYSOP.SECURITY.LEVEL _
  3538.      ELSE USER.SECURITY.LEVEL = CVI(SECURITY.LEVEL$)
  3539.      LAST.MESSAGE.READ = CVI(MID$(USER.OPTIONS$,3,2))
  3540.      USER.TRANSFER.DEFAULT$ = MID$(USER.OPTIONS$,5,1)
  3541.      IF USER.TRANSFER.DEFAULT$ = " " THEN _
  3542.         USER.TRANSFER.DEFAULT$ = "N"
  3543.      CALL XFERTYPE (2,TRUE)
  3544.      X = ASC(MID$(USER.OPTIONS$,6,1))
  3545.      GR = (X MOD 3)
  3546.      BOLD.TEXT$ = CHR$(48 - (X > 50))
  3547.      USER.TEXT.COLOR = (X - GR)/3 + 21
  3548.      IF USER.TEXT.COLOR > 37 THEN _
  3549.         USER.TEXT.COLOR = USER.TEXT.COLOR - 7
  3550.      IF EMPHASIZE.OFF$ <> "" THEN _
  3551.         CALL QTPUT (COLOR.RESET$,0)
  3552.      IF EMPHASIZE.ON.DEF$ <> "" THEN _
  3553.         EMPHASIZE.OFF$ = ESCAPE$ + "[" + BOLD.TEXT$ + ";40;" + MID$(STR$(USER.TEXT.COLOR),2) + "m" _
  3554.      ELSE EMPHASIZE.OFF$ = ""
  3555.      IF GR = 1 AND NOT EIGHT.BIT THEN _
  3556.         GR = 0
  3557.      CALL SETUGD (GR, USER.GRAPHIC.DEFAULT$)
  3558.      CALL GETCOLOR
  3559.      RIGHT.MARGIN = CVI(MID$(USER.OPTIONS$,7,2))
  3560.      IF RIGHT.MARGIN > 72 THEN _
  3561.         RIGHT.MARGIN = 72
  3562.      CI$ = CITY.STATE$
  3563.      CALL TRIM (CI$)
  3564. 9510 USER.OPTIONS = CVI(MID$(USER.OPTIONS$,9,2))
  3565.      PROMPT.BELL = (USER.OPTIONS AND 1) > 0
  3566.      EXPERT.USER = (USER.OPTIONS AND 2) > 0
  3567.      CALL SETEXPERT
  3568.      NULLS = (USER.OPTIONS AND 4) > 0
  3569.      UPPER.CASE = (USER.OPTIONS AND 8) > 0
  3570.      LINE.FEEDS = (USER.OPTIONS AND 16) > 0
  3571.      CHECK.BULLETIN.LOGON = (USER.OPTIONS AND 32) > 0
  3572.      SKIP.FILES.LOGON = (USER.OPTIONS AND 64) > 0
  3573.      AUTODOWNLOAD.DESIRED = (USER.OPTIONS AND 128) > 0
  3574.      REQ.QUES.ANSWERED = (USER.OPTIONS AND 256) > 0
  3575.      MAIL.WAITING = (USER.OPTIONS AND 512) > 0
  3576.      X = (USER.OPTIONS AND 1024 ) > 0
  3577.      CALL SETHILITE (NOT X)
  3578.      IF NOT HIGHLIGHT.OFF THEN _
  3579.         CALL QTPUT (EMPHASIZE.OFF$,0)
  3580.      TURBO.KEY.USER = (USER.OPTIONS AND 2048) > 0
  3581.      TURBO.KEY = FALSE
  3582.      GOSUB 11480
  3583.      PAGE.LENGTH = ASC(MID$(USER.OPTIONS$,13,1))
  3584.      IF SUB.BOARD THEN _
  3585.         GOTO 9520
  3586.      X$ = ECHOER$
  3587.      ECHOER$ = MID$(USER.OPTIONS$,14,1)
  3588.      IF INSTR("ICR",ECHOER$) = 0 THEN _
  3589.         ECHOER$ = "R"
  3590.      IF X$ <> ECHOER$ THEN _
  3591.         GOSUB 9525
  3592.      CALL SETECHO (ECHOER$)
  3593. 9520 NUL$ = MID$(STRING$(5,0),1, - 5 * NULLS)
  3594.      CALL SETCRLF
  3595.      USE.TPUT = (UPPER.CASE OR XON.XOFF)
  3596.      PASSWORD.SAVE$ = PASSWORD$
  3597.      RETURN
  3598. 9525 IF ECHOER$ = "R" THEN _
  3599.         CALL QTPUT1 ("RBBS now echoing what you type") _
  3600.      ELSE IF ECHOER$ = "C" THEN _
  3601.              CALL QTPUT1 ("Please set your communications package to echo") _
  3602.           ELSE CALL QTPUT1 ("Intermediate host now echoing what you type")
  3603.      RETURN
  3604. '
  3605. ' *  B - COMMAND FROM MAIN MENU (READ BULLETINS)
  3606. '
  3607. 9700 RETURN.ON$ = "N"
  3608.      A1$ = BULLETIN.MENU$
  3609. 9701 CALL SUBMENU ("Read what bulletin(s), L)ist, N)ew ([ENTER] = none)",_
  3610.                    A1$, BULLETIN.PREFIX$,"",RETURN.ON$,_
  3611.                    USER.GRAPHIC.DEFAULT$,FALSE,FALSE,FALSE,"")
  3612.      IF Q = 0 THEN _
  3613.         RETURN
  3614.      CALL CHKCARRIER                                                 ' KG061203
  3615.      IF SUBROUTINE.PARAMETER = -1 THEN _
  3616.         RETURN 10595
  3617.      IF Z$ = "N" THEN _
  3618.         GOTO 9760
  3619.      STOP.INTERRUPTS = FALSE
  3620.      CALL BUFFILE (FILE.NAME$,ANS.INDEX)
  3621.      CALL UPDTCALR ("Read bulletin " + FILE.NAME$,1)                 ' KG081201
  3622.      GOTO 9701
  3623. '
  3624. ' *  CHECK AND REVIEW NEW BULLETINS SINCE LAST LOGON
  3625. '
  3626. 9750 CALL CHKNEWBUL (BOARD.CHECK.DATE$,NUM.NEW.BULLETS,NEW.BULLETS$)
  3627.      CALL SKIPLINE (1)
  3628.      A$ = STR$(NUM.NEW.BULLETS) + _
  3629.           " NEW BULLETIN(S) since last call" + _
  3630.           NEW.BULLETS$
  3631.      GOSUB 12979
  3632.      RETURN
  3633. 9760 ' ****  [entry when want review plus chance to read] *********
  3634.      GOSUB 9750
  3635.      IF NUM.NEW.BULLETS > 0 THEN _
  3636.         LAST.INDEX = NUM.NEW.BULLETS + 1 : _                         ' KG081201
  3637.         A$ = "READ ALL new bulletins ([Y],N)" : _
  3638.         GOSUB 12999 : _
  3639.         IF NOT NO THEN _
  3640.            ANS.INDEX = 1: _                                          ' KG081201
  3641.            GOTO 9700
  3642.      LAST.INDEX = 0                                                  ' KG081201
  3643.      IF ANS.INDEX < 1 THEN _
  3644.         RETURN                                                       ' KG081201
  3645.      GOTO 9701                                                       ' KG081201
  3646. '
  3647. ' *  W - COMMAND FROM MAIN MENU (WHO'S ON THE OTHER NODES)
  3648. '
  3649. 9800 CALL WHOSON (NODES.IN.SYSTEM)
  3650.     CALL ASKMORE ("",TRUE,FALSE,X,TRUE) 'Pe 02/11/89 
  3651.      GOSUB 5344
  3652.      RETURN
  3653. '
  3654. ' *  1 - COMMAND FROM SYSOP MENU (DISPLAY COMMENTS)
  3655. '
  3656. 10070 CALL MUZAK (7)
  3657.       FILE.NAME$ = COMMENTS.FILE$
  3658.       IF NOT STOP.INTERRUPTS THEN _
  3659.          A$ = "* Ctrl-K(^K) / ^X aborts. ^S suspends, ^Q resumes *" : _
  3660.          GOSUB 12976
  3661.       GOSUB 20150
  3662.       RETURN
  3663. '
  3664. ' *  U - COMMAND FROM UTILITY MENU (DISPLAY USERS)
  3665. ' *  2 - COMMAND FROM SYSOP MENU (DISPLAY USERS)
  3666. '
  3667. 10090 CALL MUZAK (6)
  3668.       A$ = "List - U)sers, R)ecent callers"
  3669.       CALL SKIPLINE (1)
  3670.       GOSUB 12932                                                    ' KG081201
  3671.       IF Q = 0 THEN _
  3672.          RETURN
  3673.       CALL ALLCAPS (B$(ANS.INDEX))                                   ' KG081201
  3674.       ON INSTR("UR",B$(ANS.INDEX)) + 1 GOTO 10090,10096,10093        ' KG081201
  3675. 10093 CALL DISPCALL
  3676.       RETURN
  3677. 10096 USER.RECORD.HOLD$ = USER.RECORD$
  3678.       GOSUB 12700
  3679.       CALL OPENUSER (HIGHEST.USER.RECORD)
  3680.       GOSUB 9450
  3681.       STOP.INTERRUPTS = FALSE
  3682.       NON.STOP = (PAGE.LENGTH < 1)
  3683.       I = 1
  3684.       Z$ = SYSOP.PASSWORD.1$ + " " + SYSOP.PASSWORD.2$
  3685. 10097 IF I > HIGHEST.USER.RECORD OR RET THEN _
  3686.          GOTO 10099
  3687.       GET 5,I
  3688.       X$ = MID$(USER.RECORD$,START.HASH,LEN.HASH)
  3689.       IF ASC(X$)=0 OR LEFT$(X$,3)="   " OR LEFT$(PASSWORD$,3)="   " THEN _
  3690.          GOTO 10098
  3691.       IF INSTR(X$,Z$) > 0 OR SYSOP.SECURITY.LEVEL <= CVI(MID$(USER.RECORD$,47,2)) THEN _
  3692.          IF NOT SYSOP THEN _
  3693.             GOTO 10098
  3694.       CALL ASKMORE ("",TRUE,TRUE,XX,FALSE)
  3695.       IF NO OR SUBROUTINE.PARAMETER = -1 THEN _
  3696.          GOTO 10099
  3697.       A$ = LEFT$(X$,36) + CITY.STATE$ + LAST.DATE.TIME.ON$
  3698.       GOSUB 12979
  3699. 10098 I = I + 1
  3700.       GOTO 10097
  3701. 10099 A$ = ""
  3702.       LSET USER.RECORD$ = USER.RECORD.HOLD$
  3703.       STOP.INTERRUPTS = TRUE
  3704.       RETURN
  3705. '
  3706. ' *  3 - COMMAND FROM SYSOP MENU (RECOVER MESSAGES)
  3707. '
  3708. 10390 A$ = "Recover Msg #"
  3709.       GOSUB 12995
  3710.       CALL CHECKINT (B$(1))
  3711.       IF EC <> 0 THEN _
  3712.          GOTO 10390
  3713.       MESSAGE.TO.RECOVER = TESTED.INTEGER.VALUE
  3714.       IF MESSAGE.TO.RECOVER < 1 THEN _
  3715.          GOTO 12980
  3716.       GOSUB 5344
  3717.       ACTION.FLAG = FALSE
  3718.       CALL RECOVMSG (MESSAGE.TO.RECOVER,FIRST.MESSAGE.RECORD,ACTION.FLAG)
  3719. 10392 IF ACTION.FLAG THEN _
  3720.          GOTO 1900
  3721.       RETURN
  3722. '
  3723. ' *  4 - COMMAND FROM SYSOP MENU (DELETE COMMENTS)
  3724. '
  3725. 10530 A$ = "Delete comments (Y/[N])"
  3726.       GOSUB 12995
  3727.       IF YES THEN _
  3728.          CALL OPENOUTW (COMMENTS.FILE$)
  3729.       CLOSE 2
  3730. 10550 RETURN
  3731. '
  3732. ' *  TIME LIMIT EXCEEDED EXIT
  3733. '
  3734. 10553 CALL UPDTCALR ("Time limit exceeded",1)
  3735.       CALL QTPUT1 ("Sorry "+FIRST.NAME$ +" Your time limit has expired")
  3736.       GOTO 10562           'Pe 02/04/88
  3737. '
  3738. ' *  Q - COMMAND FROM GLOBAL FUNCTIONS
  3739. '
  3740. 10560 IF TIME.REMAINING! < 5  THEN LOGOFF$ = "L"
  3741.       IF EXPERT.USER THEN LOGOFF$ = "L"
  3742. '      IF YES AND CONFERENCE.MODE AND _
  3743. '         COMMENTS.AS.MESSAGES THEN LOGOFF$ = "L"
  3744.       IF LOGOFF$ = "L" THEN 10562
  3745. '
  3746. 10562 GOSUB 9100
  3747.       IF NOT SYSOP AND _
  3748.          USER.SECURITY.LEVEL < SECURITY.EXEMPT.FROM.EPILOG THEN _
  3749.            FILE.NAME$ = EPILOG$ : _
  3750.            GOSUB 11520
  3751.       IF LOCAL.USER.MODE OR NOT LOCAL.USER THEN _
  3752.          CALL UPDTCALR ("Logged off",1)
  3753.       CALL MUZAK (4)
  3754.       GOTO 10595
  3755. 10570 IF TIME.REMAINING! < 2 THEN _        'Pe 02/06/89
  3756.        GOTO 10573                          'Pe 02/06/89
  3757.      CALL QTPUT ("  A)bort Logoff "+ CRLF$+ _
  3758.                  "  C)omment to Sysop then log off "+CRLF$ + _
  3759.                  "  G)o ahead Log me off (NO Comment) " + CRLF$ ,1)
  3760. A$ =  "  Enter Choice (A,C,[G]) "
  3761.         SUBROUTINE.PARAMETER = 1
  3762.         TURBO.KEY = -TURBO.KEY.USER
  3763.         CALL TGET
  3764.         CALL ALLCAPS (B$)
  3765.         X = INSTR("ACG",B$)
  3766.         IF B$ = "" THEN _
  3767.            GET.OUT = TRUE : _
  3768.            GOTO 10562
  3769.     ON X GOTO 10571,10572,10573
  3770.     GOTO 10573
  3771. 10571 RETURN
  3772. 10572 LOGOFF$ = "G"
  3773.       GET.OUT = TRUE
  3774.       GOTO 1800
  3775. 10573 GET.OUT = TRUE
  3776.       LOGOFF$ = "L"     'Pe 02/04/89
  3777.       GOTO 10560
  3778. 10590 CALL UPDTCALR ("Sleep Disconnect",1)
  3779.       SUB.BOARD = FALSE
  3780. 10595 CALL GETIME
  3781.       GOSUB 13700
  3782.       IF DOWNLOAD.COMPLETED = TRUE AND AUTO.END = 1 THEN _    'AUTOLOGOFF MOD
  3783.       GOSUB 46000 
  3784.       SUBROUTINE.PARAMETER = 0
  3785.       CALL CARRIER
  3786.       IF SUBROUTINE.PARAMETER = -1 THEN _
  3787.          GOTO 10597
  3788.       IF GRN$ = ORIG.MSG.NAME$ THEN _
  3789.          GET.OUT = TRUE
  3790.       IF (SUB.BOARD AND NOT GET.OUT) THEN _
  3791.          GOSUB 5380 : _
  3792.          B$(2) = "MAIN" : _
  3793.          Z$ = "MAIN" : _
  3794.          Q = 2 : _
  3795.          FF = 8 : _
  3796.          CALL QTPUT1 ("Time limit exceeded in " + GRN$) : _
  3797.          SUB.BOARD = FALSE : _
  3798.          GOTO 1240
  3799. 10597 CALL UPDATEU (TRUE)
  3800.       GOTO 13540
  3801. 10620 CALL UPDTCALR(LG$(LOGON.ERROR.INDEX),2)
  3802.       IF EXIT.TO.DOORS THEN _
  3803.          CALL UPDATEU (TRUE)
  3804. 10621 IF ACTIVE.USER.NAME$ = "" THEN _
  3805.          ACTIVE.USER.NAME$ = "NAME UNAVAILABLE"
  3806.       Z$ = ACTIVE.USER.NAME$ + _
  3807.            " on at " + _
  3808.            CURRENT.DATE$ + _
  3809.            ", " + _
  3810.            TIM$ + _
  3811.            "** LOGON DENIED **, " + _
  3812.            BAUD.PARITY$
  3813.       NG$ = Z$ + _
  3814.             SPACE$(128 - LEN(Z$))
  3815. 10698 CALL MUZAK (5)
  3816.       A$ = "Access denied!"
  3817.       GOSUB 12976
  3818.       CALL DELAYIT (8 + BPS)
  3819.       GOTO 13545
  3820. '
  3821. ' *  M - COMMAND FROM UTILITY MENU (CHANGE MARGINS)
  3822. '
  3823. 10925 UTILITY.MARGIN.CHANGE = TRUE
  3824.       GOSUB 3100
  3825.       UTILITY.MARGIN.CHANGE = FALSE
  3826.       RETURN
  3827. '
  3828. ' *  7 - COMMAND FROM SYSOP MENU (EXIT TO DOS)
  3829. '
  3830. 10930 IF DOS.VERSION < 2 OR _
  3831.          (REQUIRED.RINGS = 0 AND NOT SHOOT.YOURSELF) THEN _
  3832.          CALL QTPUT1 ("Remote DOS unavailable") : _
  3833.          RETURN
  3834. 10932 IF LOCAL.USER AND NOT DEBUG THEN _
  3835.          CALL QTPUT1 ("Only for remote SYSOP's") : _
  3836.          RETURN
  3837.       CALL DOSEXIT
  3838.       SUBROUTINE.PARAMETER = -9
  3839.       CALL FINDFUNC
  3840.       GOTO 202
  3841. '
  3842. ' *  D - COMMAND FROM MAIN MENU (EXIT TO DOORS)
  3843. '
  3844. 10970 IF NOT DOORS.AVAILABLE OR _
  3845.          (REQUIRED.RINGS = 0 AND NOT SHOOT.YOURSELF) THEN _
  3846.          CALL QTPUT1 ("All doors locked!") : _
  3847.          RETURN
  3848.       IF TIME.LOCK AND 1 AND NOT HAS.DOORED THEN _
  3849.          CALL TIMELOCK : _
  3850.          IF NOT OK THEN _
  3851.             RETURN
  3852. 10974 A1$ = MENU$(5)
  3853.       CALL TALK (5,A$)
  3854.       CALL SUBMENU ("Open which door, L)ist" + PRESS.ENTER.EXPERT$, _
  3855.                     A1$,"",".BAT","",_
  3856.                     USER.GRAPHIC.DEFAULT$,TRUE,FALSE,TRUE,"")
  3857.       IF Q = 0 THEN _
  3858.          RETURN
  3859.       IF SUBROUTINE.PARAMETER = -1 THEN _
  3860.          RETURN 10595
  3861. 10986 Z$ = FILE.NAME$
  3862.       CALL DOOREXIT
  3863.       RETURN
  3864. '
  3865. ' *  5 - COMMAND FROM SYSOP MENU (USER FILE MAINTENANCE)
  3866. '
  3867. 11000 TU = USER.FILE.INDEX
  3868.       USER.RECORD.HOLD$ = USER.RECORD$
  3869.       REG.DATE.HOLD$ = REG.DATE$
  3870. 11001 STOP.INTERRUPTS = TRUE
  3871.       I = 1
  3872.       SCAN.USERS = FALSE
  3873.       TURBO.KEY = -TURBO.KEY.USER
  3874.       A$ = "A)dd, L)st, P)rt, M)od, S)can users"
  3875.       GOSUB 12998
  3876. 11003 IF Q = 0 THEN _
  3877.          GOTO 20093
  3878.       QQ = 0
  3879.       Z$ = LEFT$(B$(1),1)
  3880.       CALL ALLCAPS (Z$)
  3881.       IF Z$ = "A" THEN _
  3882.          GOTO 12300 _
  3883.       ELSE IF Z$ = "M" THEN _
  3884.               STOP.INTERRUPTS = TRUE _
  3885.            ELSE IF Z$ = "P" THEN _
  3886.                    QQ = TRUE _
  3887.                 ELSE IF Z$ = "S" THEN _
  3888.                         SCAN.USERS = TRUE : _
  3889.                         STOP.INTERRUPTS = TRUE _
  3890.                      ELSE IF Z$ <> "L" THEN _
  3891.                              GOTO 11001
  3892. 11005 CALL OPENUSER (HIGHEST.USER.RECORD)
  3893.       GOSUB 9450
  3894.       Z = 1
  3895.       IF SCAN.USERS THEN _
  3896.          A$ = "Scan for N)ame, P)wd, C)" + USER.LOCATION$ + ", L)evel" + _ ' KG072002
  3897.               LEFT$(", H)ash id",-9*(START.HASH > 1 AND LEN.HASH > 0)) : _
  3898.          GOSUB 12999 : _
  3899.          A$ = "" : _
  3900.          SCAN.FUNCTION$ = LEFT$(B$(1),1) : _
  3901.          CALL ALLCAPS (SCAN.FUNCTION$) : _
  3902.          CR = 0 : _
  3903.          GOSUB 12979 : _
  3904.          GOSUB 12966 : _
  3905.          GOTO 12962
  3906. 11010 FOR J = Z TO HIGHEST.USER.RECORD
  3907.          GET 5,J
  3908. 11015    X$ = MID$(USER.RECORD$,START.HASH,LEN.HASH)
  3909.          IF ASC(X$) = 0 OR LEFT$(X$,3) = "   " THEN _
  3910.             GOTO 11310
  3911.          OF = CVI(SECURITY.LEVEL$)
  3912.          IF OF > USER.SECURITY.LEVEL THEN _
  3913.             IF NOT GLOBAL.SYSOP THEN _
  3914.                GOTO 11310
  3915.          A$ = FG.4$ + RIGHT$("     " + STR$(LOC(5)),4) + _
  3916.               ":" + _
  3917.               FG.1$ + USER.NAME$ + _
  3918.               FG.2$ + "SECURITY" + _
  3919.               RIGHT$("     " + STR$(OF),5) + _
  3920.               " "
  3921. 11020    A$ = A$ + _
  3922.               FG.3$ + "Password = " + _
  3923.               PASSWORD$ + EMPHASIZE.OFF$
  3924. 11025    IF QQ THEN _
  3925.             CALL PRINTIT (A$)
  3926. 11027    GOSUB 12979
  3927.          IF RET <> 0 THEN _
  3928.             GOTO 11330
  3929.          IF OF < ORIG.MIN.SEC THEN _
  3930.             A$ = EMPHASIZE.ON$ + "<Locked out>" + EMPHASIZE.OFF$ + SPACE$(7) : _
  3931.             GOTO 11030
  3932.          IF OF >= SYSOP.SECURITY.LEVEL THEN _
  3933.             A$ = EMPHASIZE.ON$ + "  (SYSOP)  " + EMPHASIZE.OFF$ + SPACE$(8) : _
  3934.             GOTO 11030
  3935.          A$ = SPACE$(19)
  3936. 11030    A$ = A$ + _
  3937.               LAST.DATE.TIME.ON$ + _
  3938.              "   " + _
  3939.              FG.4$ + CITY.STATE$ + EMPHASIZE.OFF$
  3940. 11100    IF QQ THEN _
  3941.             CALL PRINTIT (A$)
  3942. 11101    CALL QTPUT1 (A$)
  3943.         IF RET <> 0 THEN _
  3944.            GOTO 11330
  3945.         A$ = "  DOWNLOADS = " + _
  3946.              RIGHT$("     " + STR$(CVI(USER.DOWNLOADS$)),5) + _
  3947.              "   " + _
  3948.              "UPLOADS = " + _
  3949.              RIGHT$("     " + STR$(CVI(USER.UPLOADS$)),5) + _
  3950.              "   " + _
  3951.              " Times on ="
  3952.          A$ = A$ + RIGHT$("     " + STR$(CVI(MID$(USER.OPTIONS$,1,2))),5) + _
  3953.              "   " + _
  3954.              "TIME USED = " + _
  3955.              RIGHT$("    " + STR$(CVI(ELAPSED.TIME$)),4) + _
  3956.              " Min"
  3957.         IF QQ THEN _
  3958.            CALL PRINTIT (A$)
  3959. 11105   CALL QTPUT1 (A$)
  3960.         IF RET <> 0 THEN _
  3961.            GOTO 11330
  3962.          A$ = "BYTES: Dwn=" + STR$(CVS(DL.BYTES$)) + _
  3963.               "  Up=" + STR$(CVS(UL.BYTES$)) + _
  3964.               " TODAY Dwn: #=" + STR$(CVS(TODAY.DL$)) + _
  3965.               " Bytes=" + STR$(CVS(TODAY.BYTES$))
  3966.          IF QQ THEN _
  3967.             CALL PRINTIT (A$)
  3968.          CALL QTPUT1 (A$)
  3969.          IF RET <> 0 THEN _
  3970.             GOTO 11330
  3971. 11106   IF (START.INDIV = 0 OR LEN.INDIV = 0) AND _
  3972.            (START.HASH = 0 OR LEN.HASH = 0) AND _
  3973.            NOT RESTRICT.BY.DATE THEN _
  3974.               GOTO 11107
  3975.         IF (START.HASH > 1 AND LEN.HASH > 0) THEN _
  3976.            A$ = "Hash: " + MID$(USER.RECORD$,START.HASH,LEN.HASH) _
  3977.         ELSE A$ = ""
  3978.         IF (START.INDIV > 1 AND LEN.INDIV > 0) THEN _
  3979.            A$ = A$ + " Indiv: " + MID$(USER.RECORD$,START.INDIV,LEN.INDIV)
  3980.         IF RESTRICT.BY.DATE THEN _
  3981.             GOSUB 11480 : _
  3982.             A$ = A$ + "  Registered: " + _
  3983.                  REG.DISPLAY.DATE$
  3984.         CALL QTPUT1 (A$)
  3985.         IF QQ THEN _
  3986.            CALL PRINTIT (A$)
  3987.         IF RET <> 0 THEN _
  3988.            GOTO 11330
  3989. 11107   IF NOT STOP.INTERRUPTS THEN _
  3990.            GOTO 11310
  3991. 11110 A$ ="D)elete,  F)ind,  M)enu,  N)ew pwd,  P)rint,  R)eset graphics"+CRLF$
  3992.   A$ = A$ +"Q)uit,  S)ecurity, U)ploads/downloads,  #)user , T)ime used"
  3993.         IF RESTRICT.BY.DATE THEN _
  3994.            A$ = A$ + _
  3995.                 ",$)RegDate"
  3996.         GOSUB 12999
  3997.         IF NOT SCAN.USERS AND Q = 0 THEN _
  3998.            GOTO 11310
  3999. 11115   Z$ = LEFT$(B$(1),1)
  4000.         CALL ALLCAPS (Z$)
  4001.         X = INSTR("DNPQFSMRU$T#",Z$)
  4002.         IF Z$ = "" AND SCAN.USERS THEN _
  4003.            GOTO 12965
  4004.     ON X GOTO 11130,11160,11220,11320,11340,11390,11330,11400,11410,11450,11420,11127
  4005.         GOTO 11110
  4006. 11125   Z = VAL(B$)
  4007.         IF Z < 1 OR Z > HIGHEST.USER.RECORD THEN _
  4008.            GOTO 11127
  4009.         GOTO 11010
  4010. 11127   A$ = "What record #"
  4011.         GOSUB 12995
  4012.         GOTO 11125
  4013. '
  4014. ' *  D - COMMAND FROM 5- USER MAINTENANCE OPTIONS (DELETE USER)
  4015. '
  4016. 11130   A$ = "Delete user (Y/[N])"
  4017.         GOSUB 12995
  4018.         IF YES THEN _
  4019.            LSET USER.NAME$ = CHR$(0) + _
  4020.                              "deleted user" : _
  4021.            LSET SECURITY.LEVEL$ = MKI$(MINIMUM.LOGON.SECURITY - 1) : _
  4022.            LSET LAST.DATE.TIME.ON$ = "01-01-80" + _
  4023.                                      " " + _
  4024.                                      TIME.LOGGED.ON$
  4025.         GOTO 11290
  4026. '
  4027. ' *  N - COMMAND FROM 5- USER MAINTENANCE OPTIONS (CHANGE USER PASSWORD)
  4028. '
  4029. 11160   GOSUB 12800
  4030.         GOTO 11290
  4031. '
  4032. ' *  P - COMMAND FROM 5- USER MAINTENANCE OPTIONS (PRINT USER FILE)
  4033. '
  4034. 11220   QQ = NOT QQ
  4035.         GOTO 11015
  4036. 11290   USER.FILE.INDEX = LOC(5)
  4037.         GOSUB 12989
  4038.         GOSUB 9440
  4039.         GOSUB 12991
  4040.         USER.FILE.INDEX = 0
  4041.         GOTO 11015
  4042. 11310   IF SCAN.USERS THEN _
  4043.            GOTO 12965
  4044. 11311 NEXT
  4045. '
  4046. ' *  Q - COMMAND FROM 5- USER MAINTENANCE OPTIONS (QUIT TO MAIN MENU)
  4047. '
  4048. 11320 USER.FILE.INDEX = TU
  4049.       LSET USER.RECORD$ = USER.RECORD.HOLD$
  4050.       REG.DATE$ = REG.DATE.HOLD$
  4051.       RETURN 1200
  4052. '
  4053. ' *  M - COMMAND FROM 5- USER MAINTENANCE OPTIONS (MAIN USER MAINT. MENU)
  4054. '
  4055. 11330 CLOSE 2
  4056.       GOTO 11001
  4057. '
  4058. ' *  F - COMMAND FROM 5- USER MAINTENANCE OPTIONS (FIND USER)
  4059. '
  4060. 11340 A$ = PROMPT.HASH$ + _
  4061.            " to find"
  4062.       CALL SKIPLINE (1)
  4063.       GOSUB 12995
  4064.       IF Q = 0 THEN _
  4065.          GOTO 11340
  4066.       TEMP.HASH.VALUE$ = B$
  4067.       IF LEN(TEMP.HASH.VALUE$) < 3 OR LEN(TEMP.HASH.VALUE$) > LEN.HASH THEN _
  4068.          GOTO 11340
  4069.       CALL ALLCAPS (TEMP.HASH.VALUE$)
  4070.       IF START.INDIV < 1 THEN _
  4071.          GOTO 11345
  4072. 11342 A$ = PROMPT.INDIV$ + _
  4073.            " to find"
  4074.       GOSUB 12995
  4075.       IF Q = 0 THEN _
  4076.          GOTO 11342
  4077.       TEMP.INDIV.VALUE$ = B$
  4078.       IF LEN(TEMP.INDIV.VALUE$) > LEN.INDIV THEN _
  4079.          GOTO 11342
  4080.       CALL ALLCAPS (TEMP.INDIV.VALUE$)
  4081. 11345 GOSUB 12600
  4082.       GOSUB 12984
  4083.       USER.FILE.INDEX = 0
  4084.       IF FOUND THEN _
  4085.          GOTO 11015
  4086. 11380 A$ = TEMP.HASH.VALUE$ + _
  4087.            " " + _
  4088.            TEMP.INDIV.VALUE$ + _
  4089.            " not found"
  4090.       GOSUB 12977
  4091.       GOTO 11310
  4092. '
  4093. ' *  S - COMMAND FROM 5- USER MAINTENANCE OPTIONS (CHANGE USER SECURITY)
  4094. '
  4095. 11390 GOSUB 11395
  4096.       LSET SECURITY.LEVEL$ = MKI$(OF)
  4097.       GOTO 11290
  4098. 11395 A$ = "New sec level"
  4099.       GOSUB 12995
  4100.       CALL ALLCAPS (B$(1))
  4101.       Z$ = B$(1)
  4102.       OF = VAL(Z$)
  4103.       IF OF > USER.SECURITY.LEVEL THEN _
  4104.          OF = USER.SECURITY.LEVEL
  4105.       RETURN
  4106. '
  4107. ' *  R - COMMAND FROM 5- USER MAINTENANCE OPTIONS (RESET USER GRAPHICS)
  4108. '
  4109. 11400 A = CVI(MID$(USER.OPTIONS$,9,2))
  4110.       A = A AND &HFAFF                ' TURN HIGHLIGHTING OFF
  4111.       LSET USER.OPTIONS$ = LEFT$(USER.OPTIONS$,5) + _
  4112.                            "0" + _
  4113.                            MID$(USER.OPTIONS$,7,2) + _
  4114.                            MKI$(A) + _
  4115.                            MID$(USER.OPTIONS$,11)
  4116.       GOTO 11290
  4117. '*************************************************************
  4118. '* U - COMMAND FROM 5 CHANGE UPLOADS AND DOWNLOADS           *
  4119. '*************************************************************
  4120. '
  4121. 11410 A$ = "Enter NEW value for ToTal Uploads, press (ENTER) for no change"
  4122.       GOSUB 12995
  4123.       IF Q = 0 THEN _
  4124.       GOTO 11411
  4125.       LSET USER.UPLOADS$ = MKI$(VAL(B$(1)))
  4126. 11411 A$ = "Enter NEW # of Upload bytes, press (ENTER) for no change"
  4127.       GOSUB 12995
  4128.       IF Q = 0 THEN _
  4129.       GOTO 11412
  4130.       LSET UL.BYTES$ = MKS$(VAL(B$(1)))
  4131. 11412 A$ = "Enter NEW value for TOTAL downloads, press (ENTER) for no change"
  4132.       GOSUB 12995
  4133.       IF Q = 0 THEN _
  4134.       GOTO 11413
  4135.       LSET USER.DOWNLOADS$ = MKI$(VAL(B$(1)))
  4136. 11413 A$ = "Enter NEW value for DOWNLOADS TODAY, press (ENTER) for no change"
  4137.       GOSUB 12995
  4138.       IF Q = 0 THEN _
  4139.       GOTO 11414
  4140.       LSET TODAY.DL$ = MKS$(VAL(B$(1)))
  4141. 11414 A$ = "Enter NEW value for TODAYS BYTES, press (ENTER) for no change"
  4142.       GOSUB 12995
  4143.       IF Q = 0 THEN _
  4144.       GOTO 11415
  4145.       LSET TODAY.BYTES$ = MKS$(VAL(B$(1)))
  4146. 11415 A$ = "Enter NEW # of TOTAL Download bytes, press (ENTER) for no change"
  4147.       GOSUB 12995
  4148.       IF Q = 0 THEN _
  4149.       GOTO 11290
  4150.       LSET DL.BYTES$ = MKS$(VAL(B$(1)))
  4151.       GOTO 11290
  4152. '
  4153. '*****************************************************************
  4154. '* T - COMMAND FROM 5---CHANGE TIME LEFT                         *
  4155. '*****************************************************************
  4156. 11420  A$ = crlf$ + "Enter new value for Time used, press (ENTER) for no change"
  4157.       GOSUB 12995
  4158.       IF Q = 0 THEN _
  4159.       GOTO 11290
  4160.       LSET ELAPSED.TIME$ = MKI$(VAL(B$(1)))
  4161.       GOTO 11290
  4162. '
  4163. ' *  $ - COMMAND FROM 5 - USER MAINTENANCE (CHANGE REGISTRATION DATE)
  4164. '
  4165. 11450 A$ = "Enter new registration date (MM-DD-YY)"
  4166.       GOSUB 12995
  4167.       IF Q = 0 THEN _
  4168.          GOTO 11015
  4169. 11455 WORK.DATE$ = B$(1)
  4170.       IF LEN(WORK.DATE$) < 8 THEN _
  4171.          GOTO 11450
  4172.       GOSUB 11470
  4173.       IF NOT OK THEN _
  4174.          GOTO 11450
  4175.       LSET USER.OPTIONS$ = LEFT$(USER.OPTIONS$,10) + _
  4176.                            REG.DATE$ + _
  4177.                            MID$(USER.OPTIONS$,13)
  4178.       GOSUB 11480
  4179.       REG.DATE$ = REG.DATE.HOLD$
  4180.       GOTO 11290
  4181. '
  4182. ' *  CALCULATE REGISTRATION DATES
  4183. '
  4184. 11470 IF LEN(WORK.DATE$) < 10 THEN _
  4185.          WORK.DATE$ = LEFT$(WORK.DATE$,6) + _
  4186.                       "19" + _
  4187.                       RIGHT$(WORK.DATE$,2)
  4188.       TODAY.REG.YY = VAL(MID$(WORK.DATE$,7))
  4189.       TODAY.REG.MM = VAL(LEFT$(WORK.DATE$,2))
  4190.       TODAY.REG.DD = VAL(MID$(WORK.DATE$,4,2))
  4191.       OK = TODAY.REG.YY > 1979 AND TODAY.REG.MM > 0 AND _
  4192.            TODAY.REG.MM < 13 AND TODAY.REG.DD > 0 AND _
  4193.            TODAY.REG.DD < 32
  4194.       IF OK THEN _
  4195.          CALL TWOBYTEDATE (TODAY.REG.YY,TODAY.REG.MM,TODAY.REG.DD,REG.DATE$)
  4196.       RETURN
  4197. 11480 X$ = MID$(USER.OPTIONS$,11,2)
  4198.       IF CVI(X$) <> 0 THEN _
  4199.          REG.DATE$ = X$ : _
  4200.       ELSE GOSUB 11482
  4201.       CALL UNCDATE (REG.DATE$,USER.REG.YY,USER.REG.MM,USER.REG.DD,REG.DISPLAY.DATE$)
  4202.       IF CVI(X$) = 0 THEN _
  4203.          REG.DISPLAY.DATE$ = "00-00-00"
  4204.       RETURN
  4205. 11482 WORK.DATE$ = DATE$
  4206.       GOTO 11470
  4207. '
  4208. ' *  ALLOW USERS TO ANSWER A "QUESTIONNAIRE" BASED ON THE RBBS-PC SCRIPT
  4209. '
  4210. 11520 CALL ASKUSERS
  4211.       IF NOT OK THEN _
  4212.          RETURN
  4213.       IF ADJUSTED.SECURITY THEN _
  4214.          GOSUB 12989 : _
  4215.          LSET SECURITY.LEVEL$ = MKI$(USER.SECURITY.LEVEL) : _
  4216.          GOSUB 9440 : _
  4217.          GOSUB 12991 : _
  4218.          CALL CALLOPT : _
  4219.          CALL XFERTYPE (2,TRUE) : _
  4220.          GOSUB 5135
  4221.       REDIM A$(ADIM)
  4222.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4223.          RETURN 10595
  4224.       OK = TRUE
  4225.       RETURN
  4226. '
  4227. ' *  A - COMMAND FROM 5- USER MAINTENANCE OPTIONS (ADD USER)
  4228. '
  4229. 12300 A1$ = ""
  4230.       ATTEMPTS = 0
  4231.       USER.SECURITY.LEVEL.SAVE = USER.SECURITY.LEVEL
  4232.       FIRST.NAME.SAVE$ = FIRST.NAME$
  4233.       LAST.NAME.SAVE$ = LAST.NAME$
  4234.       ACTIVE.USER.NAME.SAVE$ = ACTIVE.USER.NAME$
  4235.       CITY.STATE.SAVE$ = CI$
  4236.       HASH.VALUE.SAVE$ = HASH.VALUE$
  4237.       INDIV.VALUE.SAVE$ = INDIV.VALUE$
  4238.       GOSUB 12500
  4239.       GOSUB 12840
  4240.       GOSUB 12850
  4241.       GOSUB 12598
  4242.       IF USER.FILE.INDEX = 0 THEN _
  4243.          GOSUB 12984 : _
  4244.          GOTO 12330
  4245.       IF FOUND THEN _
  4246.          D$ = "User already exists" : _
  4247.          GOSUB 1315 : _
  4248.          GOSUB 12984 : _
  4249.          GOTO 12330
  4250. 12310 GOSUB 12630
  4251.       GOSUB 12800
  4252.       GOSUB 11395
  4253.       TEMP.SECURITY.LEVEL = OF
  4254.       GOSUB 12900
  4255.       LSET LAST.DATE.TIME.ON$ = CURRENT.DATE$ + _
  4256.                                 " " + _
  4257.                                 TIME.LOGGED.ON$
  4258.       GOSUB 12960
  4259.       CALL ALLCAPS (B$)
  4260.       LSET CITY.STATE$ = B$
  4261.       LSET ELAPSED.TIME$ = MKI$(0)
  4262.       IF START.HASH > 1 THEN _
  4263.          MID$(USER.RECORD$,START.HASH,LEN.HASH) = HASH.VALUE$
  4264.       IF START.INDIV > 1 THEN _
  4265.          MID$(USER.RECORD$,START.INDIV,LEN.INDIV) = INDIV.VALUE$
  4266.       GOSUB 9440
  4267. 12320 GOSUB 12991
  4268. 12330 USER.SECURITY.LEVEL = USER.SECURITY.LEVEL.SAVE
  4269.       FIRST.NAME$ = FIRST.NAME.SAVE$
  4270.       LAST.NAME$ = LAST.NAME.SAVE$
  4271.       ACTIVE.USER.NAME$ = ACTIVE.USER.NAME.SAVE$
  4272.       CI$ = CITY.STATE.SAVE$
  4273.       HASH.VALUE$ = HASH.VALUE.SAVE$
  4274.       INDIV.VALUE$ = INDIV.VALUE.SAVE$
  4275.       USER.FILE.INDEX = TU
  4276.       LSET USER.RECORD$ = USER.RECORD.HOLD$
  4277.       GOTO 11001
  4278. '
  4279. ' *  GET USER FIRST AND LAST NAMES
  4280. '
  4281. 12500 IF ATTEMPTS > 5 THEN _
  4282.          FF = TRUE : _
  4283.          RETURN
  4284. 12510 GOSUB 12700
  4285.       ATTEMPTS = ATTEMPTS + 1
  4286.       A$ = A1$ + _
  4287.            FIRST.NAME.PROMPT$
  4288.       CALL SKIPLINE (1)
  4289.       LOGON.ACTIVE = TRUE
  4290.       GOSUB 12555
  4291.       LOGON.ACTIVE = FALSE
  4292.       CALL TRIM (Z$)
  4293.       FIRST.NAME$ = Z$
  4294.       IF Q <> 1 THEN _
  4295.          I = 2: _
  4296.          GOSUB 12556 : _
  4297.          GOTO 12540
  4298. 12530 A$ = A1$ + _
  4299.            LAST.NAME.PROMPT$
  4300.       GOSUB 12555
  4301.       IF Q > 0 AND INSTR(B$,";") = 0 THEN _
  4302.          Z$ = B$ _
  4303.       ELSE Z$ = B$(1)
  4304.       CALL ALLCAPS (Z$)
  4305. 12540 CALL TRIM (Z$)
  4306.       LAST.NAME$ = Z$
  4307.       IF LEN(LAST.NAME$) < 2 THEN _
  4308.          IF LEN(FIRST.NAME$) > 2 THEN _
  4309.             GOTO 12500
  4310.       IF (LEN(FIRST.NAME$) + LEN(LAST.NAME$)) > 30 THEN _
  4311.          GOTO 12500
  4312.       IF USER.SECURITY.LEVEL.SAVE < SYSOP.SECURITY.LEVEL THEN _
  4313.          IF (LEN(FIRST.NAME$) < 2 OR LEN(LAST.NAME$) < 2) THEN _
  4314.             GOTO 12500 _
  4315.          ELSE IF LEFT$(FIRST.NAME$,1)=" " OR LEFT$(LAST.NAME$,1)=" " THEN _
  4316.                  GOTO 12500
  4317. 12550 ACTIVE.USER.NAME$ = MID$(FIRST.NAME$ + " " + LAST.NAME$,1,31)
  4318.       IF HASH.INDIV > 1 THEN _
  4319.          IF Q < 3 THEN _
  4320.             GOSUB 12558 : _
  4321.             IF NO THEN _
  4322.                GOTO 12500
  4323.       Z$ = FIRST.NAME$
  4324.       RETURN
  4325. '
  4326. ' *  CHECK FOR NAMES NOT ALLOWED
  4327. '
  4328. 12555 GOSUB 12995
  4329.       IF Q = 0 THEN _
  4330.          RETURN 12500
  4331.       I = 1
  4332. 12556 Z$ = B$(I)
  4333. 12557 CALL ALLCAPS (Z$)
  4334.       CALL REMNONALF (Z$,31,91)
  4335.       RETURN
  4336. 12558 A$ = "Are you '" + _
  4337.            ACTIVE.USER.NAME$ + _
  4338.            "' ([Y],N)"
  4339.       GOSUB 12995
  4340.       RETURN
  4341. 12570 FOUND = FALSE
  4342.       CALL OPENWORK (2,TRASHCAN.FILE$)
  4343.       IF EC = 53 THEN _
  4344.          GOTO 710
  4345. 12580 IF EOF(2) THEN _
  4346.          RETURN
  4347.       INPUT #2,INVALID.NAME$
  4348.       IF Z$ <> INVALID.NAME$ THEN _
  4349.          GOTO 12580
  4350.       FOUND = TRUE
  4351.       RETURN
  4352. 12595 CALL QTPUT1 ("Name not valid here. Call recorded")
  4353.       CALL UPDTCALR ("Name violation: "+ACTIVE.USER.NAME$,1)
  4354.       GOTO 10621
  4355. '
  4356. ' *  COMMON SEARCH USER FILE ROUTINE
  4357. '
  4358. 12598 TEMP.HASH.VALUE$ = HASH.VALUE$
  4359.       TEMP.INDIV.VALUE$ = INDIV.VALUE$
  4360. 12600 GOSUB 4910
  4361.       GOSUB 12988
  4362.       IF IN.CONF.MENU THEN _
  4363.          IF NOT PRIVATE.DOOR THEN _
  4364.             CALL QTPUT1 ("Checking Users...")
  4365. 12605 CALL OPENUSER (HIGHEST.USER.RECORD)
  4366.       GOSUB 9450
  4367.       CALL FINDUSER (TEMP.HASH.VALUE$,TEMP.INDIV.VALUE$,START.HASH,LEN.HASH,_
  4368.                      START.INDIV,LEN.INDIV,HIGHEST.USER.RECORD,FOUND,_
  4369.                      USER.FILE.INDEX,SL)
  4370.      IF FOUND THEN _
  4371.         RETURN
  4372.      IF CURRENT.USER.COUNT < (HIGHEST.USER.RECORD-1)*.95 THEN _
  4373.         RETURN
  4374.      A$ = "No room for new users in " + GRN$
  4375.      CALL UPDTCALR (A$,2)
  4376.      IF ACTIVE.USER.FILE$ <> MAIN.USER.FILE$ THEN _
  4377.         USER.FILE.INDEX = 0 : _
  4378.         RETURN
  4379.       IF REMEMBER.NEW.USERS AND NOT SURVIVE.NOUSER.ROOM THEN _
  4380.          GOSUB 1397
  4381.       USER.FILE.INDEX = 0
  4382.       IF SURVIVE.NOUSER.ROOM THEN _
  4383.          REMEMBER.NEW.USERS = FALSE
  4384.       RETURN
  4385. '
  4386. ' *  AUGMENT USER COUNT, LOCK 4 REC BLOCK IN USER, UNLOCK FILES
  4387. '
  4388. 12630 GOSUB 23000
  4389.       CURRENT.USER.COUNT = CURRENT.USER.COUNT + (SL = 0) * REMEMBER.NEW.USERS
  4390. 12632 GOSUB 24000
  4391.       GOSUB 12985
  4392.       IF REMEMBER.NEW.USERS THEN _
  4393.          GOSUB 12989
  4394.       GOSUB 12990
  4395.       RETURN
  4396. '
  4397. ' *  INFORM USER OF WHAT CONFERENCE USER FILE HE IS VIEWING
  4398. '
  4399. 12700 IF CONFERENCE.MODE THEN _
  4400.          A$ = "Users of " + _
  4401.               GRN$ + _
  4402.               ":" : _
  4403.          GOSUB 12979
  4404.       RETURN
  4405. '
  4406. ' *  GET PASSWORD FROM NEWUSER
  4407. '
  4408. 12800 CALL NEWPASWRD ("Enter PASSWORD you'll use to logon again",FALSE)
  4409.       IF SUBROUTINE.PARAMETER < 0 THEN _
  4410.          GOTO 202
  4411.       IF USER.SECURITY.LEVEL.SAVE < SYSOP.SECURITY.LEVEL THEN _
  4412.          IF B$ = SPACE$(LEN(B$)) THEN _
  4413.             GOTO 12800
  4414.       LSET PASSWORD$ = Z$
  4415.       RETURN
  4416. '
  4417. ' *  GET HASH VALUE FOR CURRENT USER TO LOOK UP IN THE USER'S FILE
  4418. '
  4419. 12840 IF START.HASH = 1 THEN _
  4420.          HASH.VALUE$ = ACTIVE.USER.NAME$ : _
  4421.          RETURN
  4422.       X$ = A1$ + _
  4423.            PROMPT.HASH$
  4424.       CALL UNTILRIGHT (X$,HASH.VALUE$,2,LEN.HASH)
  4425.       RETURN
  4426. '
  4427. ' *  GET FIELD TO INDIVIDUATE ONE USER FROM ANOTHER (NAME FIELD IS DEFAULT)
  4428. '
  4429. 12850 IF START.INDIV < 1 THEN _
  4430.          RETURN
  4431.       IF START.INDIV = 1 THEN _
  4432.          INDIV.VALUE$ = ACTIVE.USER.NAME$ : _
  4433.          RETURN
  4434.       X$ = A1$ + _
  4435.            PROMPT.INDIV$
  4436.       CALL UNTILRIGHT (X$,INDIV.VALUE$,2,LEN.INDIV)
  4437.       RETURN
  4438. '
  4439. ' *  SET NEWUSER DEFAULTS
  4440. '
  4441. 12900 LSET USER.NAME$ = ACTIVE.USER.NAME$
  4442.       LSET USER.OPTIONS$ = MKI$(0) + _
  4443.                            MKI$(0) + _
  4444.                            " 0" + _
  4445.                            MKI$(64) + _
  4446.                            MKI$(16) + _
  4447.                            MKI$(0) + _
  4448.                            CHR$(23) + _
  4449.                            DEFAULT.ECHOER$
  4450.       LSET USER.DOWNLOADS$ = MKI$(0)
  4451.       LSET USER.UPLOADS$ = MKI$(0)
  4452.       IF ENFORCE.UPLOAD.DOWNLOAD.RATIOS THEN _
  4453.          LSET TODAY.DL$ = MKS$(0) : _
  4454.          LSET TODAY.BYTES$ = MKS$(0) : _
  4455.          LSET DL.BYTES$ = MKS$(0) : _
  4456.          LSET UL.BYTES$ = MKS$(0)
  4457.       LSET SECURITY.LEVEL$ = MKI$(TEMP.SECURITY.LEVEL)
  4458.       LSET ELAPSED.TIME$ = MKI$(0)
  4459.       RETURN
  4460. 12930 TURBO.KEY = -TURBO.KEY.USER                                    ' KG081201
  4461. 12932 CALL POPCSTACK                                                 ' KG081201
  4462.       GOTO 12997                                                     ' KG081201
  4463. '
  4464. ' *  GET CITY AND STATE FROM NEWUSER
  4465. '
  4466. 12960 A$ = A1$ + _
  4467.            USER.LOCATION$
  4468.       GOSUB 12995
  4469.       IF Q = 0 THEN _
  4470.          GOTO 12960
  4471.       IF B$ = SPACE$(LEN(B$)) THEN _
  4472.          GOTO 12960
  4473.       CALL ALLCAPS (B$)
  4474.       LSET CITY.STATE$ = B$
  4475.       CI$ = B$
  4476.       RETURN
  4477. '
  4478. ' *  S - COMMAND FROM 5 - USER MAINTENANCE OPTIONS (SCAN USERS)
  4479. '
  4480. 12962 X = 0
  4481.       FF = FALSE
  4482.       MACRO.MIN = 99
  4483.       A$ = "String to search"
  4484.       GOSUB 12998
  4485.       IF Q = 0 THEN _
  4486.          GOTO 11001
  4487.       CALL ALLCAPS (B$)
  4488.       WK$ = B$
  4489.       IF SCAN.FUNCTION$ = "L" THEN _
  4490.          WK$ = "," + _
  4491.                STR$(VAL(WK$)) + _
  4492.                ","
  4493. 12963 GET 5,I
  4494.       GOSUB 12966
  4495.       X = INSTR(SCAN.FIELD$,WK$)
  4496.       IF X > 0 THEN _
  4497.          GOTO 11015
  4498. 12965 I = I + 1
  4499.       IF I > HIGHEST.USER.RECORD THEN _
  4500.          LSET USER.RECORD$ = USER.RECORD.HOLD$ : _
  4501.          GOTO 11001
  4502.       X = 0
  4503.       GOTO 12963
  4504. 12966 FF = INSTR("NCPLH",SCAN.FUNCTION$)
  4505. 12967 ON FF GOTO 12968,12969,12970,12972,12971
  4506.       GOTO 11001
  4507. '
  4508. ' *  N - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR NAME)
  4509. '
  4510. 12968 SCAN.FIELD$ = USER.NAME$
  4511.       RETURN
  4512. '
  4513. ' *  C - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR CITY/ST)
  4514. '
  4515. 12969 SCAN.FIELD$ = CITY.STATE$
  4516.       RETURN
  4517. '
  4518. ' *  P - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR PASSWORD)
  4519. '
  4520. 12970 SCAN.FIELD$ = PASSWORD$
  4521.       RETURN
  4522. '
  4523. ' *  H - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR HASH ID)
  4524. '
  4525. 12971 IF START.HASH > 0 AND LEN.HASH > 0 THEN _
  4526.          SCAN.FIELD$ = MID$(USER.RECORD$,START.HASH,LEN.HASH)
  4527.       RETURN
  4528. '
  4529. ' *  L - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR LEVEL)
  4530. '
  4531. 12972 SCAN.FIELD$ = "," + _
  4532.                     STR$(CVI(SECURITY.LEVEL$)) + _
  4533.                     ","
  4534.       RETURN
  4535. '
  4536. ' * CALLS INTO SEPARATELY COMPILED SUBROUTINES (RBBS-SUB)
  4537. '
  4538. '
  4539. ' * STANDARD ENTRY FOR RBBS-PC'S COMMON TERMINAL OUTPUT ROUTINE
  4540. '
  4541. 12975 SUBROUTINE.PARAMETER = 1
  4542.       GOTO 12981
  4543. 12976 SUBROUTINE.PARAMETER = 2
  4544.       GOTO 12981
  4545. 12977 SUBROUTINE.PARAMETER = 3
  4546.       GOTO 12981
  4547. 12978 SUBROUTINE.PARAMETER = 4
  4548.       GOTO 12981
  4549. 12979 SUBROUTINE.PARAMETER = 5
  4550.       GOTO 12981
  4551. 12980 SUBROUTINE.PARAMETER = 6
  4552. 12981 CALL TPUT
  4553. 12983 IF SUBROUTINE.PARAMETER < 0 THEN _
  4554.          GOTO 202
  4555.       IF SUBROUTINE.PARAMETER = 8 THEN _
  4556.          GOSUB 12995
  4557.       RETURN
  4558. '
  4559. ' * STANDARD ENTRY FOR RBBS-PC'S FILE LOCKING WHEN RUNNING MULTIPLE RBBS-PC'S
  4560. '
  4561. 12984 SUBROUTINE.PARAMETER = 1  ' LOCK USERS & MESSAGES
  4562.       GOTO 12994
  4563. 12985 SUBROUTINE.PARAMETER = 2  ' UNLOCK MESSAGES AND FLUSH
  4564.       FLUSHED = TRUE
  4565.       GOTO 12994
  4566. 12986 SUBROUTINE.PARAMETER = 3  ' LOCK MESSAGES
  4567.       GOTO 12994
  4568. 12987 SUBROUTINE.PARAMETER = 4  ' UNLOCK MESSAGES
  4569.       GOTO 12994
  4570. 12988 SUBROUTINE.PARAMETER = 5  ' LOCK USERS
  4571.       GOTO 12994
  4572. 12989 SUBROUTINE.PARAMETER = 6  ' LOCK USER BLOCK
  4573.       GOTO 12994
  4574. 12990 SUBROUTINE.PARAMETER = 7  ' UNLOCK USERS
  4575.       GOTO 12994
  4576. 12991 SUBROUTINE.PARAMETER = 8  ' UNLOCK USER BLOCK
  4577.       GOTO 12994
  4578. 12992 SUBROUTINE.PARAMETER = 9  ' LOCK COMMENTS/UPLOAD DIR
  4579.       GOTO 12994
  4580. 12993 SUBROUTINE.PARAMETER = 10 ' UNLOCK COMMENTS/UPLOAD DIR
  4581. 12994 CALL FILELOCK
  4582.       IF FLUSHED THEN _
  4583.          FIELD 1,128 AS MESSAGE.RECORD$ : _
  4584.          FLUSHED = FALSE
  4585.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4586.          SUBROUTINE.PARAMETER = -9 : _
  4587.          CALL FINDFUNC : _
  4588.          GOTO 202
  4589.       RETURN
  4590. '
  4591. ' * STANDARD ENTRY FOR RBBS-PC'S COMMON TERMINAL INPUT ROUTINE
  4592. '
  4593. 12995 GOSUB 12997
  4594.       SUBROUTINE.PARAMETER = 1
  4595. 12996 CALL TGET
  4596. 12997 IF SUBROUTINE.PARAMETER < 0 THEN _
  4597.          GOTO 202
  4598.       RETURN
  4599. 12998 A$ = A$ + _
  4600.            PRESS.ENTER$
  4601.       GOTO 12995
  4602. 12999 TURBO.KEY = -TURBO.KEY.USER
  4603.       GOTO 12995
  4604. '
  4605. ' *  MAIN SYSTEM ERROR TRAP - ALL ERRORS PASS THROUGH THIS ROUTINE
  4606. '
  4607. 13000 IF DEBUG THEN _
  4608.          A$ = "DEBUG Trap ERL=" + _
  4609.               STR$(EL) + _
  4610.               " ERR=" + _
  4611.               STR$(EC) : _
  4612.               CALL PRINTIT(A$) : _
  4613.               D$ = A$ : _
  4614.               GOSUB 1315
  4615.       IF EL = 1905 AND EC = 63 THEN _
  4616.          CLOSE 1 : _
  4617.          KILL ACTIVE.MESSAGE.FILE$ : _
  4618.          GOTO 5350
  4619.       IF EL = 4371 AND EC = 6 THEN _
  4620.          GOTO 1200
  4621.       IF EL =  4740 THEN _
  4622.          GOTO 4745
  4623.       IF EL =  5151 AND EC = 62 THEN _
  4624.          CALL UPDTCALR (PASSWORDS.FILE$ + " bad format!",2) : _
  4625.          GOTO 5160
  4626. 13500 CALL LOGERROR
  4627.       CALL QTPUT1 (CALLERS.RECORD$)
  4628.       GOTO 1200
  4629. '
  4630. ' * COMMON EXIT FROM RBBS-PC (I.E. "ABANDON ALL HOPE OH YE WHO ENTER HERE")
  4631. '
  4632. 13538 CALL UPDTCALR ("No calls.  Recycling.",1)
  4633.       GOTO 13549
  4634. 13540 IF LOCAL.USER THEN _
  4635.          IF NOT LOCAL.USER.MODE THEN _
  4636.             GOTO 13549
  4637. 13543 IF (NOT SYSOP) THEN _
  4638.          IF ((USER.FILE.INDEX = 0 AND REMEMBER.NEW.USERS) OR _
  4639.             NEW.USER = TRUE) THEN _
  4640.             GOTO 13549
  4641. 13545 CALL UPDATEC
  4642. 13549 GOSUB 13700
  4643.       IF LOCAL.USER OR _
  4644.          MODEM.OFFHOOK THEN _
  4645.          GOTO 13555
  4646.       IF NOT FOSSIL THEN _
  4647.          OUT MODEM.CONTROL.REGISTER,INP(MODEM.CONTROL.REGISTER) AND 254 : _
  4648.          CALL DELAYIT (DTR.DROP.DELAY) : _
  4649.          OUT MODEM.CONTROL.REGISTER,INP(MODEM.CONTROL.REGISTER) OR 1 : _
  4650.          GOTO 13553
  4651. 13550 CALL FOSSTATUS(COMPORT%,STATUS%)
  4652.       STATUS% = STATUS% AND &H4000
  4653.       IF STATUS% <> &H4000 THEN _
  4654.          CALL DELAYIT (8 + BPS)
  4655.       STATE%=0
  4656.       CALL FOSDTR(COMPORT%,STATE%)
  4657.       CALL DELAYIT (DTR.DROP.DELAY)
  4658.       STATE%=1
  4659.       CALL FOSDTR(COMPORT%,STATE%)
  4660. 13553 CALL DELAYIT (DTR.DROP.DELAY)
  4661.       CALL MODEMPUT (MODEM.GO.OFFHOOK.COMMAND$)
  4662.       CALL DELAYIT (MODEM.COMMAND.DELAY.TIME)
  4663. 13555 ACTIVE.MESSAGE.FILE$ = ORIG.MESSAGE.FILE$
  4664.       GOSUB 12986
  4665.       GOSUB 5344
  4666.       GET 1,NODE.RECORD.INDEX                                        ' KG061101
  4667.       MID$(MESSAGE.RECORD$,57,1) = "I"
  4668.       MID$(MESSAGE.RECORD$,40,2) = " 0"                              ' KG061101
  4669.       MID$(MESSAGE.RECORD$,72,2) = " 0"                              ' KG061101
  4670.       PUT 1,NODE.RECORD.INDEX
  4671.       GOSUB 12985
  4672.       CLOSE 1,2,4,5
  4673.       IF NOT FOSSIL THEN _
  4674.          CLOSE 3
  4675.       IF RECYCLE.TO.DOS THEN _
  4676.          GOTO 203
  4677.       RUN 100
  4678. 13600 CLS
  4679.       LOCATE ,,0
  4680.       CALL PSCRN (DF$ + " file not found/invalid.  Run CONFIG.")     ' KG072001
  4681.       CALL DELAYIT (3)
  4682.       GOTO 203
  4683. 13700 IF MESSAGE.FILE.LOCK THEN _
  4684.          GOSUB 12987
  4685. 13710 IF USER.FILE.LOCK THEN _
  4686.          GOSUB 12990
  4687. 13720 IF USER.BLOCK.LOCK THEN _
  4688.          GOSUB 12991
  4689.       RETURN
  4690. '
  4691. ' *  C/R - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (QUIT TO MAIN MENU)
  4692. '
  4693. 20093 IF USER.FILE.INDEX > 0 THEN _
  4694.          CALL OPENUSER (HIGHEST.USER.RECORD) : _
  4695.          GET 5,USER.FILE.INDEX : _
  4696.          GOSUB 9500
  4697. 20095 RETURN 1200
  4698. '
  4699. ' *  V - COMMAND FROM FILES MENU (VIEW ARC CONTENTS)
  4700. '
  4701. 20140 CALL GETARC
  4702.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4703.          GOTO 13540
  4704.       IF DENY.ACCESS THEN _
  4705.          GOTO 1386
  4706.       RETURN
  4707. '
  4708. ' * GO TO THE FILE SYSTEM TO LIST THE SYSOP'S COMMENTS
  4709. '
  4710. 20150 FILESYS.PARAMETER = 1
  4711.       GOTO 20200
  4712. '
  4713. ' * GO TO THE FILE SYSTEM TO LIST THE FILE DIRECTORIES
  4714. '
  4715. 20155 FILESYS.PARAMETER = 2
  4716.       GOTO 20200
  4717. '
  4718. ' * GO TO THE FILE SYSTEM TO DOWNLOAD FILES
  4719. '
  4720. 20160 FILESYS.PARAMETER = 3
  4721.       GOTO 20200
  4722. '
  4723. ' * GO TO THE FILE SYSTEM WHEN RETURNING FROM EXTERNAL PROTOCOLS
  4724. '
  4725. 20165 FILESYS.PARAMETER = 4
  4726.       GOTO 20200
  4727. '
  4728. ' * GO TO THE FILE SYSTEM TO UPLOAD FILES
  4729. '
  4730. 20170 FILESYS.PARAMETER = 5
  4731.       GOTO 20200
  4732. '
  4733. ' * GO TO THE FILE SYSTEM TO SCAN FILE SYSTEM DIRECTORIES
  4734. '
  4735. 20175 FILESYS.PARAMETER = 6
  4736.       GOTO 20200
  4737. '
  4738. ' * GO TO THE FILE SYSTEM TO HANDLE "PERSONAL" FILES
  4739. '
  4740. 20180 FILESYS.PARAMETER = 7
  4741.       GOTO 20200
  4742. '
  4743. ' * GO TO THE FILE SYSTEM TO LIST "NEW" FILES
  4744. '
  4745. 20185 FILESYS.PARAMETER = 8
  4746.       GOTO 20200
  4747. '
  4748. ' * RETURN TO THE FILE SYSTEM AFTER HANDLING EXTENDED FILE DESCRIPTIONS
  4749. '
  4750. 20190 FILESYS.PARAMETER = 9
  4751. 20200 CALL FILESYS
  4752.  IF DOWNLOAD.COMPLETED AND AUTO.END = 1 THEN _
  4753.                          GOTO 20235                   'AUTO Loggoff Mod
  4754.       ON FILESYS.PARAMETER GOTO 20205, _
  4755.                                 20210, _
  4756.                                 20215, _
  4757.                                 20220, _
  4758.                                 20225, _
  4759.                                 20230, _
  4760.                                 20235
  4761. 20205 RETURN
  4762. 20210 RETURN 202
  4763. 20215 RETURN 1200
  4764. 20220 RETURN 1380
  4765. 20225 SYSOP.COMMENT = TRUE
  4766.       MAX.MESSAGE.LINES = MAX.EXTENDED.LINES
  4767.       GOSUB 2008
  4768.       GOTO 20190
  4769. 20230 RETURN 10553
  4770. 20235 RETURN 10595
  4771. '
  4772. ' *  GET MESSAGE HEADER RECORD DATA
  4773. '
  4774. 23000 GET 1,1
  4775.       HIGH.MESSAGE.NUMBER = VAL(LEFT$(MESSAGE.RECORD$,8))
  4776.       AUTO.ADD.SECURITY   = CVI(MID$(MESSAGE.RECORD$,9,2))
  4777.       CALLS.TODATE! = VAL(MID$(MESSAGE.RECORD$,11,10))
  4778.       CURRENT.USER.COUNT = VAL(MID$(MESSAGE.RECORD$,57,5))
  4779.       FIRST.MESSAGE.RECORD = VAL(MID$(MESSAGE.RECORD$,68,7))
  4780.       NEXT.MESSAGE.RECORD = VAL(MID$(MESSAGE.RECORD$,75,7))
  4781.       HIGHEST.MESSAGE.RECORD = VAL(MID$(MESSAGE.RECORD$,82,7))
  4782.       IF ACTIVE.MESSAGE.FILE$ = ORIG.MESSAGE.FILE$ THEN _
  4783.          NODES.IN.SYSTEM = VAL(MID$(MESSAGE.RECORD$,127))
  4784.       RETURN
  4785. 23100 GET 1,NEXT.MESSAGE.RECORD
  4786.       IF MID$(MESSAGE.RECORD$,61,1) = ":" THEN _
  4787.          CALL CHECKINT (MID$(MESSAGE.RECORD$,117,4)) : _
  4788.          IF EC = 0 AND (TESTED.INTEGER.VALUE > 1) AND (TESTED.INTEGER.VALUE < 100) THEN _
  4789.             Y = TESTED.INTEGER.VALUE : _
  4790.             CALL CHECKINT (MID$(MESSAGE.RECORD$,2,4)) : _
  4791.             IF EC = 0 AND TESTED.INTEGER.VALUE > HIGH.MESSAGE.NUMBER THEN _
  4792.                HIGH.MESSAGE.NUMBER = TESTED.INTEGER.VALUE : _
  4793.                NEXT.MESSAGE.RECORD = NEXT.MESSAGE.RECORD + Y : _
  4794.                CALL QTPUT1 ("Correcting Msg Header") : _
  4795.                MSG.CORRECTED = TRUE : _
  4796.                GOTO 23100
  4797.       RETURN
  4798. '
  4799. ' *  UPDATE MESSAGE HEADER RECORD DATA
  4800. '
  4801. 24000 MID$(MESSAGE.RECORD$,1,8) = STR$(HIGH.MESSAGE.NUMBER)
  4802.       MID$(MESSAGE.RECORD$,11,10) = STR$(CALLS.TODATE!)          
  4803.       MID$(MESSAGE.RECORD$,57,5) = STR$(CURRENT.USER.COUNT)          ' KG061502
  4804.       MID$(MESSAGE.RECORD$,68,7) = STR$(FIRST.MESSAGE.RECORD)
  4805.       MID$(MESSAGE.RECORD$,75,7) = STR$(NEXT.MESSAGE.RECORD)
  4806.       MID$(MESSAGE.RECORD$,82,7) = STR$(HIGHEST.MESSAGE.RECORD)
  4807.       PUT 1,1
  4808.       RETURN
  4809. '
  4810. ' * A - COMMAND FROM LIBRARY MENU (ARCHIVE A SELECTED LIBRARY DISK)
  4811. '
  4812. 30000 SUBROUTINE.PARAMETER = 4
  4813.       CALL LIBRARY
  4814.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4815.          RETURN 10595
  4816.       RETURN
  4817. '
  4818. ' * C - COMMAND FROM LIBRARY MENU (CHANGE TO A LIBRARY DISK)
  4819. '
  4820. 30100 SUBROUTINE.PARAMETER = 2
  4821.       CALL LIBRARY
  4822.       RETURN
  4823. '
  4824. ' * D - COMMAND FROM LIBRARY MENU (DOWNLOAD F DISK/FILE FROM LIBRARY)
  4825. '
  4826. 30200 IF TIME.LOCK AND 2 AND NOT HAS.PRIVDOOR THEN _                 ' KG052501
  4827.          CALL TIMELOCK : _
  4828.          IF NOT OK THEN _
  4829.             RETURN
  4830.       IF LIBRARY.DISK.CHAR$ = "0000" THEN _
  4831.          CALL QTPUT1 ("You must select a Library disk first!") : _
  4832.          RETURN
  4833.       SUBROUTINE.PARAMETER = 3
  4834.       CALL LIBRARY
  4835.       GOTO 20160
  4836. '
  4837. ' * CALCULATE TIME REMAINING FOR USER
  4838. '
  4839. 41000 CALL CHKTREMAIN (TIME.REMAINING!)
  4840.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4841.          RETURN 10553
  4842.       RETURN
  4843. '
  4844. ' * SHOW USER CURRENT ACCESS LEVEL
  4845. '
  4846. 41070 A$ = "Granted access level" + _
  4847.            STR$(USER.SECURITY.LEVEL) + _
  4848.            MID$(" (SYSOP)",1,-8 * (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL))
  4849.       GOSUB 12975
  4850.       RETURN
  4851. '
  4852. ' * NULLS SET FOR NEW USERS
  4853. '
  4854. 42700 CALL SKIPLINE (1)
  4855.       CALL QTPUT1 ("TurboKey: act on 1 character command without waiting for [ENTER]")
  4856.       A$ = "Want TurboKeys (Y/[N])"
  4857.       GOSUB 12999
  4858.       TURBO.KEY.USER = NOT YES
  4859.       CALL TOGGLE (8)
  4860.       RETURN
  4861. '
  4862. ' *  F - COMMAND FROM UTILITY MENU (FILE TRANSFER DEFALUT MODE)
  4863. ' *  FILE TRANSFER DEFAULT SET FOR NEW USERS
  4864. '
  4865. 42800 FF = INSTR(DFLTXFER$,USER.TRANSFER.DEFAULT$)
  4866.       IF FF = 0 THEN _
  4867.          FF = INSTR(INTERNAL.EQUIV$,"N")
  4868.       CALL QTPUT1 ("Current Protocol: "+MID$(DFLTXFER$,FF,1))
  4869. 42805 A$ = "Default "
  4870.       CALL XFERTYPE (3,EXPERT.USER)                                  ' KG081201
  4871.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4872.          RETURN 10595
  4873.       USER.TRANSFER.DEFAULT$ = FT$
  4874. 42810 A$ = "PROTOCOL: " + PROTO.PROMPT$
  4875.       GOSUB 12979
  4876.       RETURN
  4877. '
  4878. ' *  C - COMMAND FROM UTILITY MENU (CHANGE CASE TOGGLE)
  4879. ' *  UPPER/LOWER CASE SET FOR NEW USERS
  4880. '
  4881. 42850 GOSUB 9525                                                     ' KG081201
  4882. 42851 A$ = "Change to R)BBS, C)aller's software" + _                 ' KG081201
  4883.            MID$(", I)ntermediate host",1,-20 * (HOST.ECHO.ON$ <> "")) + _
  4884.            PRESS.ENTER.EXPERT$
  4885.       GOSUB 12930                                                    ' KG081201
  4886.       IF Q = 0 THEN _
  4887.          RETURN
  4888. 42852 Z$ = LEFT$(B$(ANS.INDEX),1)                                    ' KG081201
  4889.       CALL ALLCAPS (Z$)
  4890.       IF INSTR("ICR",Z$) = 0 THEN _
  4891.          GOTO 42851
  4892.       ECHOER$ = Z$
  4893.       CALL SETECHO (ECHOER$)
  4894.       GOSUB 9525
  4895.       RETURN
  4896. 42950 A$ = "CAN YOUR TERMINAL DISPLAY LOWER CASE ([Y]/N)"
  4897.       GOSUB 12995
  4898.       UPPER.CASE = NOT NO
  4899.       CALL TOGGLE(3)
  4900.       RETURN
  4901. '
  4902. ' *  G - COMMAND FROM UTILITY MENU (GRAPHICS WANTED)
  4903. ' *  GRAPHIC MENUS SELECTION SET FOR NEW USERS
  4904. '
  4905. 43000 GOSUB 43005
  4906.       GOTO 43022
  4907. 43005 CALL ASKGRAPH (USER.GRAPHIC.DEFAULT$)
  4908.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4909.          RETURN 10595
  4910.       IF Q = 0 THEN _
  4911.          RETURN
  4912. 43020 A$ = "Text GRAPHICS: " + _
  4913.            MID$("None AsciiColor",GR * 5 + 1,5)
  4914.       GOSUB 12979
  4915.       RETURN
  4916. 43022 IF EMPHASIZE.ON.DEF$ = "" THEN _
  4917.          RETURN
  4918.       A$ = "Do you want COLORIZED prompts ([Y],N)"
  4919.       GOSUB 12999
  4920.       HIGHLIGHT.OFF = NOT NO
  4921.       CALL TOGGLE(5)
  4922.       RETURN
  4923. 43025 CALL GRAPHIC (USER.GRAPHIC.DEFAULT$,FILE.NAME$)
  4924. '
  4925. ' *  DISPLAY NON-BREAKABLE TEXT FILES
  4926. '
  4927. 43027 STOP.INTERRUPTS = TRUE
  4928.       CALL BUFFILE (FILE.NAME$,X)
  4929.       CALL CARRIER
  4930.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4931.          RETURN 10595
  4932.       STOP.INTERRUPTS = FALSE
  4933.       RETURN
  4934. '
  4935. ' * MAKE INPUT STRING HIDDEN (USE *'S TO ECHO INPUT)
  4936. '
  4937. 45010 HIDDEN = TRUE
  4938.       GOSUB 12995
  4939.       HIDDEN = FALSE
  4940.       RETURN
  4941. 46000 SUBROUTINE.PARAMETER = 1
  4942.    A$ = "AutoLogOff Counter Active, press [ENTER] to cancle"
  4943.      IF LOCAL.USER THEN _
  4944.         GOTO 46050
  4945.          CALL ABORTLOGOFF
  4946.            IF Q = 0  THEN _
  4947.             CALL QTPUT("Log Off Aborted.......",1) : _
  4948.            AUTO.END = 0 : _
  4949.         RETURN 1205
  4950.       GET.OUT = TRUE
  4951. 46050 RETURN 10597 
  4952.